{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:22.531537Z",
     "start_time": "2024-08-05T08:06:12.808806Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:10:48.944906Z",
     "iopub.status.busy": "2025-02-07T13:10:48.944551Z",
     "iopub.status.idle": "2025-02-07T13:10:51.038598Z",
     "shell.execute_reply": "2025-02-07T13:10:51.038094Z",
     "shell.execute_reply.started": "2025-02-07T13:10:48.944883Z"
    },
    "id": "JHSdxPJuN4x7",
    "outputId": "a74dc274-dd24-4415-a3e4-1fcff4e437a2",
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
      "  from .autonotebook import tqdm as notebook_tqdm\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sys.version_info(major=3, minor=10, micro=14, releaselevel='final', serial=0)\n",
      "matplotlib 3.10.0\n",
      "numpy 1.26.4\n",
      "pandas 2.2.3\n",
      "sklearn 1.6.0\n",
      "torch 2.5.1+cu124\n",
      "cuda:0\n"
     ]
    }
   ],
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "from tqdm.auto import tqdm\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, torch:\n",
    "    print(module.__name__, module.__version__)\n",
    "\n",
    "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
    "print(device)\n",
    "\n",
    "seed = 42\n",
    "torch.manual_seed(seed)\n",
    "torch.cuda.manual_seed_all(seed)\n",
    "np.random.seed(seed)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:22.541540Z",
     "start_time": "2024-08-05T08:06:22.530536400Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:55:56.870252Z",
     "iopub.status.busy": "2025-02-07T01:55:56.869967Z",
     "iopub.status.idle": "2025-02-07T01:55:56.872885Z",
     "shell.execute_reply": "2025-02-07T01:55:56.872284Z",
     "shell.execute_reply.started": "2025-02-07T01:55:56.870230Z"
    },
    "id": "yQQEArYqWylq",
    "outputId": "bc80eeee-442a-4ff2-f69e-348314f84bce"
   },
   "outputs": [],
   "source": [
    "#挂载谷歌云盘\n",
    "\n",
    "# from google.colab import drive\n",
    "# drive.mount('/content/drive')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-07T13:10:55.883647Z",
     "iopub.status.busy": "2025-02-07T13:10:55.883189Z",
     "iopub.status.idle": "2025-02-07T13:10:56.002864Z",
     "shell.execute_reply": "2025-02-07T13:10:56.002292Z",
     "shell.execute_reply.started": "2025-02-07T13:10:55.883622Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " 历史\t        data_multi30k.py   runs\t\t\t\t      wmt16\n",
      " checkpoints    data_multi30k.sh  '[today]transformer_带bleu.ipynb'   wmt16_cut\n",
      " competitions   data_spa_en\t   transformer_带bleu-aliyun.ipynb\n"
     ]
    }
   ],
   "source": [
    "!ls"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-07T10:39:24.722768Z",
     "iopub.status.busy": "2025-02-07T10:39:24.722444Z",
     "iopub.status.idle": "2025-02-07T10:39:24.836575Z",
     "shell.execute_reply": "2025-02-07T10:39:24.836058Z",
     "shell.execute_reply.started": "2025-02-07T10:39:24.722748Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/mnt/workspace\n"
     ]
    }
   ],
   "source": [
    "!pwd\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:22.552601Z",
     "start_time": "2024-08-05T08:06:22.536531800Z"
    },
    "ExecutionIndicator": {
     "show": true
    },
    "id": "wzS4AimwWz7f",
    "tags": []
   },
   "outputs": [],
   "source": [
    "# !cp /content/drive/MyDrive/transformer-de-en/* . -r"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:55:56.878566Z",
     "iopub.status.busy": "2025-02-07T01:55:56.878216Z",
     "iopub.status.idle": "2025-02-07T01:55:56.880907Z",
     "shell.execute_reply": "2025-02-07T01:55:56.880454Z",
     "shell.execute_reply.started": "2025-02-07T01:55:56.878529Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "# !rm -rf wmt16_cut/"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "55aNBForN4x9"
   },
   "source": [
    "## 数据加载\n",
    "\n",
    "- 采用WMT16的德语和英语平行语料库，数据集主页：[WMT16](https://www.statmt.org/wmt16/multimodal-task.html#task1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:22.608302700Z",
     "start_time": "2024-08-05T08:06:22.548590200Z"
    },
    "ExecutionIndicator": {
     "show": true
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:11:03.071607Z",
     "iopub.status.busy": "2025-02-07T13:11:03.071236Z",
     "iopub.status.idle": "2025-02-07T13:11:12.276288Z",
     "shell.execute_reply": "2025-02-07T13:11:12.275578Z",
     "shell.execute_reply.started": "2025-02-07T13:11:03.071582Z"
    },
    "id": "SkjBEbr1N4x-",
    "outputId": "4b9817d0-616b-41a0-ceb7-9ff6bf0f42a1",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Looking in indexes: https://mirrors.cloud.aliyuncs.com/pypi/simple\n",
      "Requirement already satisfied: sacremoses in /usr/local/lib/python3.10/site-packages (0.1.1)\n",
      "Requirement already satisfied: regex in /usr/local/lib/python3.10/site-packages (from sacremoses) (2024.11.6)\n",
      "Requirement already satisfied: click in /usr/local/lib/python3.10/site-packages (from sacremoses) (8.1.8)\n",
      "Requirement already satisfied: joblib in /usr/local/lib/python3.10/site-packages (from sacremoses) (1.4.2)\n",
      "Requirement already satisfied: tqdm in /usr/local/lib/python3.10/site-packages (from sacremoses) (4.67.1)\n",
      "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n",
      "\u001b[0m\n",
      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.3.2\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.0\u001b[0m\n",
      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n",
      "Looking in indexes: https://mirrors.cloud.aliyuncs.com/pypi/simple\n",
      "Requirement already satisfied: subword-nmt in /usr/local/lib/python3.10/site-packages (0.3.8)\n",
      "Requirement already satisfied: mock in /usr/local/lib/python3.10/site-packages (from subword-nmt) (5.1.0)\n",
      "Requirement already satisfied: tqdm in /usr/local/lib/python3.10/site-packages (from subword-nmt) (4.67.1)\n",
      "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n",
      "\u001b[0m\n",
      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.3.2\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.0\u001b[0m\n",
      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n"
     ]
    }
   ],
   "source": [
    "#和jieba分词类似\n",
    "!pip install sacremoses\n",
    "!pip install subword-nmt\n",
    "# # BPE分词\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T10:39:47.231294Z",
     "iopub.status.busy": "2025-02-07T10:39:47.230873Z",
     "iopub.status.idle": "2025-02-07T10:39:47.344701Z",
     "shell.execute_reply": "2025-02-07T10:39:47.344240Z",
     "shell.execute_reply.started": "2025-02-07T10:39:47.231274Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/mnt/workspace\n"
     ]
    }
   ],
   "source": [
    "!pwd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:22.609302200Z",
     "start_time": "2024-08-05T08:06:22.565115500Z"
    },
    "ExecutionIndicator": {
     "show": true
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:11:19.952754Z",
     "iopub.status.busy": "2025-02-07T13:11:19.952365Z",
     "iopub.status.idle": "2025-02-07T13:12:07.145700Z",
     "shell.execute_reply": "2025-02-07T13:12:07.145205Z",
     "shell.execute_reply.started": "2025-02-07T13:11:19.952718Z"
    },
    "id": "Tc8aCQX-XrGv",
    "outputId": "67964082-2737-4d47-dd66-455e4ae69660",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[train] 源语言文本分词完成\n",
      "[train] 目标语言文本分词完成\n",
      "[val] 源语言文本分词完成\n",
      "[val] 目标语言文本分词完成\n",
      "[test] 源语言文本分词完成\n",
      "[test] 目标语言文本分词完成\n",
      "100%|####################################| 20000/20000 [00:24<00:00, 822.61it/s]\n",
      "Finished applying bpe to train files.\n",
      "Finished applying bpe to val files.\n",
      "Finished applying bpe to test files.\n"
     ]
    }
   ],
   "source": [
    "!sh data_multi30k.sh wmt16 wmt16_cut de en"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Lvk4q0-1N4x-"
   },
   "source": [
    "Dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:22.811204Z",
     "start_time": "2024-08-05T08:06:22.581320400Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:12:13.421676Z",
     "iopub.status.busy": "2025-02-07T13:12:13.421316Z",
     "iopub.status.idle": "2025-02-07T13:12:13.500202Z",
     "shell.execute_reply": "2025-02-07T13:12:13.499690Z",
     "shell.execute_reply.started": "2025-02-07T13:12:13.421652Z"
    },
    "id": "zCXKEwspN4x_",
    "outputId": "3dcce6fa-932f-4b22-9dc8-398a4b402733",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "save cache to wmt16/.cache/de2en_train_128.npy\n",
      "save cache to wmt16/.cache/de2en_val_128.npy\n"
     ]
    }
   ],
   "source": [
    "from pathlib import Path\n",
    "from torch.utils.data import Dataset, DataLoader\n",
    "\n",
    "\n",
    "\n",
    "class LangPairDataset(Dataset):\n",
    "\n",
    "    def __init__(\n",
    "        self, mode=\"train\", max_length=128, overwrite_cache=False, data_dir=\"wmt16\",\n",
    "    ):\n",
    "        self.data_dir = Path(data_dir)\n",
    "        cache_path = self.data_dir / \".cache\" / f\"de2en_{mode}_{max_length}.npy\"\n",
    "\n",
    "        if overwrite_cache or not cache_path.exists():\n",
    "            cache_path.parent.mkdir(parents=True, exist_ok=True)\n",
    "\n",
    "            with open(self.data_dir / f\"{mode}_src.bpe\", \"r\", encoding=\"utf8\") as file:\n",
    "                self.src = file.readlines() # 读取源语言文件所有行\n",
    "\n",
    "            with open(self.data_dir / f\"{mode}_trg.bpe\", \"r\", encoding=\"utf8\") as file:\n",
    "                self.trg = file.readlines() # 读取目标语言文件所有行\n",
    "\n",
    "            filtered_src = []\n",
    "            filtered_trg = []\n",
    "            # max length filter,超出最大长度的句子舍弃\n",
    "            for src, trg in zip(self.src, self.trg):\n",
    "                if len(src) <= max_length and len(trg) <= max_length: # 过滤长度超过最大长度的句子\n",
    "                    filtered_src.append(src.strip()) # 去掉句子前后的空格\n",
    "                    filtered_trg.append(trg.strip())\n",
    "            filtered_src = np.array(filtered_src)\n",
    "            filtered_trg = np.array(filtered_trg)\n",
    "            np.save(\n",
    "                cache_path,\n",
    "                {\"src\": filtered_src, \"trg\": filtered_trg },\n",
    "                allow_pickle=True,\n",
    "            )#allow_pickle=True允许保存对象数组，将过滤后的数据保存为 NumPy 数组，存储在缓存文件中\n",
    "            print(f\"save cache to {cache_path}\")\n",
    "\n",
    "        else:\n",
    "            cache_dict = np.load(cache_path, allow_pickle=True).item() #allow_pickle=True允许保存对象数组\n",
    "            print(f\"load {mode} dataset from {cache_path}\")\n",
    "            filtered_src = cache_dict[\"src\"]\n",
    "            filtered_trg = cache_dict[\"trg\"]\n",
    "\n",
    "        self.src = filtered_src\n",
    "        self.trg = filtered_trg\n",
    "\n",
    "    def __getitem__(self, index):\n",
    "        return self.src[index], self.trg[index]\n",
    "\n",
    "    def __len__(self):\n",
    "        return len(self.src)\n",
    "\n",
    "\n",
    "train_ds = LangPairDataset(\"train\")\n",
    "val_ds = LangPairDataset(\"val\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:22.820353700Z",
     "start_time": "2024-08-05T08:06:22.812366100Z"
    },
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:11:15.207331Z",
     "iopub.status.busy": "2025-02-07T13:11:15.206969Z",
     "iopub.status.idle": "2025-02-07T13:11:15.321227Z",
     "shell.execute_reply": "2025-02-07T13:11:15.320631Z",
     "shell.execute_reply.started": "2025-02-07T13:11:15.207307Z"
    },
    "id": "yHB9TDpDQlv2",
    "tags": []
   },
   "outputs": [],
   "source": [
    "!rm wmt16/.cache -r"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:22.869376300Z",
     "start_time": "2024-08-05T08:06:22.816345900Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:12:17.586386Z",
     "iopub.status.busy": "2025-02-07T13:12:17.586047Z",
     "iopub.status.idle": "2025-02-07T13:12:17.591128Z",
     "shell.execute_reply": "2025-02-07T13:12:17.590660Z",
     "shell.execute_reply.started": "2025-02-07T13:12:17.586363Z"
    },
    "id": "meHHXL3MN4x_",
    "outputId": "a001c071-7021-4dff-8bc0-3e5da01d7210",
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "27999"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(train_ds) #少了1000多个样本"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:22.870386300Z",
     "start_time": "2024-08-05T08:06:22.844639700Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:18:45.609703Z",
     "iopub.status.busy": "2025-02-07T13:18:45.609350Z",
     "iopub.status.idle": "2025-02-07T13:18:45.613097Z",
     "shell.execute_reply": "2025-02-07T13:18:45.612458Z",
     "shell.execute_reply.started": "2025-02-07T13:18:45.609679Z"
    },
    "id": "LZvJV37NN4x_",
    "outputId": "43909dbd-cf15-447b-e8b6-a07de381ad0a",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "source: ein mann in shorts und hawaiihemd lehnt sich über das geländer eines lot@@ sen@@ boots , mit nebel und bergen im hintergrund .\n",
      "target: a man in shorts and a hawaiian shirt leans over the rail of a pilot boat , with fog and mountains in the background .\n"
     ]
    }
   ],
   "source": [
    "print(\"source: {}\\ntarget: {}\".format(*train_ds[-1]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "TE8gRzYQN4yA"
   },
   "source": [
    "### Tokenizer\n",
    "\n",
    "这里有两种处理方式，分别对应着 encoder 和 decoder 的 word embedding 是否共享，这里实现共享的方案"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:23.012615500Z",
     "start_time": "2024-08-05T08:06:22.857384400Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 66,
     "referenced_widgets": [
      "7190c928edb040c3a523cdd2e3f45572",
      "990741ff083d457587665d8f620b69c3",
      "00fe6a550df547cea5b1e0d84c1a3f5f",
      "fab8b1e3187841ee894b92859fa4821b",
      "f9b0d916e1a64c2a9f384e42f3d5dcab",
      "a78199650ecc47bd81f482a2671b563a",
      "673bd3773a374261a01cfc48081c27f3",
      "83f345f7424c43929d7a304cbfb6d0fe",
      "58d69d086f644e89937347e1f9261d6f",
      "8cf462fa996c41b18fb4571e0a757363",
      "434ac4c51db74681942d2d3bd869b1df"
     ]
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:18:53.422800Z",
     "iopub.status.busy": "2025-02-07T13:18:53.422442Z",
     "iopub.status.idle": "2025-02-07T13:18:53.449001Z",
     "shell.execute_reply": "2025-02-07T13:18:53.448518Z",
     "shell.execute_reply.started": "2025-02-07T13:18:53.422775Z"
    },
    "id": "yAmlq_9YN4yA",
    "outputId": "263a89f7-9bee-4c6d-cf7a-7d82b0a81f92",
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 18103/18103 [00:00<00:00, 1008346.31it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "vocab_size: 18107\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "#载入词表，看下词表长度，词表就像英语字典,构建word2idx和idx2word\n",
    "word2idx = {\n",
    "    \"[PAD]\": 0,     # 填充 token\n",
    "    \"[BOS]\": 1,     # begin of sentence\n",
    "    \"[UNK]\": 2,     # 未知 token\n",
    "    \"[EOS]\": 3,     # end of sentence\n",
    "}\n",
    "idx2word = {value: key for key, value in word2idx.items()}\n",
    "index = len(idx2word)\n",
    "threshold = 1  # 出现次数低于此的token舍弃\n",
    "\n",
    "with open(\"wmt16/vocab\", \"r\", encoding=\"utf8\") as file:\n",
    "    for line in tqdm(file.readlines()):\n",
    "        token, counts = line.strip().split()\n",
    "        if int(counts) >= threshold:\n",
    "            word2idx[token] = index\n",
    "            idx2word[index] = token\n",
    "            index += 1\n",
    "\n",
    "vocab_size = len(word2idx)\n",
    "print(\"vocab_size: {}\".format(vocab_size))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:23.015614600Z",
     "start_time": "2024-08-05T08:06:22.932228100Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:18:58.406498Z",
     "iopub.status.busy": "2025-02-07T13:18:58.406143Z",
     "iopub.status.idle": "2025-02-07T13:18:58.437461Z",
     "shell.execute_reply": "2025-02-07T13:18:58.436995Z",
     "shell.execute_reply.started": "2025-02-07T13:18:58.406474Z"
    },
    "id": "e_ed0jmJN4yA",
    "outputId": "407a9e69-4981-42ae-c7a9-aa4c701185ef",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "raw text\n",
      "['hello', 'world']\n",
      "['tokenize', 'text', 'datas', 'with', 'batch']\n",
      "['this', 'is', 'a', 'test']\n",
      "indices\n",
      "tensor([    1, 12414,  5603,     3,     0,     0,     0])\n",
      "tensor([   1,    2, 6449,    2,   34,    2,    3])\n",
      "tensor([   1,  658,   26,    7, 9121,    3,    0])\n",
      "decode text\n",
      "[BOS] hello world [EOS] [PAD] [PAD] [PAD]\n",
      "[BOS] [UNK] text [UNK] with [UNK] [EOS]\n",
      "[BOS] this is a test [EOS] [PAD]\n"
     ]
    }
   ],
   "source": [
    "class Tokenizer:\n",
    "    def __init__(self, word2idx, idx2word, max_length=128, pad_idx=0, bos_idx=1, eos_idx=3, unk_idx=2):\n",
    "        self.word2idx = word2idx\n",
    "        self.idx2word = idx2word\n",
    "        self.max_length = max_length\n",
    "        self.pad_idx = pad_idx\n",
    "        self.bos_idx = bos_idx\n",
    "        self.eos_idx = eos_idx\n",
    "        self.unk_idx = unk_idx\n",
    "\n",
    "    def encode(self, text_list, padding_first=False, add_bos=True, add_eos=True, return_mask=False):\n",
    "        \"\"\"如果padding_first == True，则padding加载前面，否则加载后面\"\"\"\n",
    "        max_length = min(self.max_length, add_eos + add_bos + max([len(text) for text in text_list]))\n",
    "        indices_list = []\n",
    "        for text in text_list:\n",
    "            indices = [self.word2idx.get(word, self.unk_idx) for word in text[:max_length - add_bos - add_eos]]\n",
    "            if add_bos:\n",
    "                indices = [self.bos_idx] + indices\n",
    "            if add_eos:\n",
    "                indices = indices + [self.eos_idx]\n",
    "            if padding_first:\n",
    "                indices = [self.pad_idx] * (max_length - len(indices)) + indices\n",
    "            else:\n",
    "                indices = indices + [self.pad_idx] * (max_length - len(indices))\n",
    "            indices_list.append(indices)\n",
    "        input_ids = torch.tensor(indices_list)\n",
    "        masks = (input_ids == self.pad_idx).to(dtype=torch.int64) # 为了方便损失计算，这里的mask为0的地方需要计算，为1的地方不需要计算\n",
    "        return input_ids if not return_mask else (input_ids, masks)\n",
    "\n",
    "\n",
    "    def decode(self, indices_list, remove_bos=True, remove_eos=True, remove_pad=True, split=False):\n",
    "        text_list = []\n",
    "        for indices in indices_list:\n",
    "            text = []\n",
    "            for index in indices:\n",
    "                word = self.idx2word.get(index, \"[UNK]\")\n",
    "                if remove_bos and word == \"[BOS]\":\n",
    "                    continue\n",
    "                if remove_eos and word == \"[EOS]\":\n",
    "                    break\n",
    "                if remove_pad and word == \"[PAD]\":\n",
    "                    break\n",
    "                text.append(word)\n",
    "            text_list.append(\" \".join(text) if not split else text)\n",
    "        return text_list\n",
    "\n",
    "\n",
    "tokenizer = Tokenizer(word2idx=word2idx, idx2word=idx2word)\n",
    "\n",
    "tokenizer.encode([[\"hello\"], [\"hello\", \"world\"]], add_bos=True, add_eos=False)\n",
    "raw_text = [\"hello world\".split(), \"tokenize text datas with batch\".split(), \"this is a test\".split()]\n",
    "indices = tokenizer.encode(raw_text, padding_first=False, add_bos=True, add_eos=True)\n",
    "decode_text = tokenizer.decode(indices.tolist(), remove_bos=False, remove_eos=False, remove_pad=False)\n",
    "print(\"raw text\")\n",
    "for raw in raw_text:\n",
    "    print(raw)\n",
    "print(\"indices\")\n",
    "for index in indices:\n",
    "    print(index)\n",
    "print(\"decode text\")\n",
    "for decode in decode_text:\n",
    "    print(decode)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:23.016615500Z",
     "start_time": "2024-08-05T08:06:22.985590600Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T13:19:02.028506Z",
     "iopub.status.busy": "2025-02-07T13:19:02.028155Z",
     "iopub.status.idle": "2025-02-07T13:19:02.031927Z",
     "shell.execute_reply": "2025-02-07T13:19:02.031341Z",
     "shell.execute_reply.started": "2025-02-07T13:19:02.028483Z"
    },
    "jupyter": {
     "outputs_hidden": false
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "66\n",
      "54\n"
     ]
    }
   ],
   "source": [
    "for i,j in train_ds:\n",
    "    print(len(i))\n",
    "    print(len(j))\n",
    "    break"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "ftcEnnKxN4yB"
   },
   "source": [
    "### Transformer Batch Sampler\n",
    "\n",
    "> Sentence pairs were batched together by approximate sequence length. Each training batch contained a set of sentence pairs containing approximately 25000 source tokens and 25000 target tokens\n",
    "句子按照序列长度差不多的分到一个批次。 每个训练批次包含一组句子对，其中包含大约 25000 个源标记和 25000 个目标标记"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:23.046108400Z",
     "start_time": "2024-08-05T08:06:22.990095800Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:19:06.749029Z",
     "iopub.status.busy": "2025-02-07T13:19:06.748664Z",
     "iopub.status.idle": "2025-02-07T13:19:06.755614Z",
     "shell.execute_reply": "2025-02-07T13:19:06.755083Z",
     "shell.execute_reply.started": "2025-02-07T13:19:06.749006Z"
    },
    "id": "qP8nznIuN4yB",
    "tags": []
   },
   "outputs": [],
   "source": [
    "class SampleInfo: #下面的info对象\n",
    "    def __init__(self, i, lens):\n",
    "        \"\"\"\n",
    "        记录文本对的序号和长度信息\n",
    "        输入：\n",
    "            - i (int): 文本对的序号。\n",
    "            - lens (list): 文本对源语言和目标语言的长度\n",
    "        \"\"\"\n",
    "        self.i = i\n",
    "        # 加一是考虑填补在文本前后的特殊词元，lens[0]和lens[1]分别表示源语言和目标语言的长度\n",
    "        self.max_len = max(lens[0], lens[1]) + 1\n",
    "        self.src_len = lens[0] + 1\n",
    "        self.trg_len = lens[1] + 1\n",
    "\n",
    "# 一个批量生成器，根据词元数目的限制来控制批量的大小。它会根据传入的样本信息，在不超过设定大小的情况下，逐步构建批量。\n",
    "class TokenBatchCreator:\n",
    "    def __init__(self, batch_size):\n",
    "        \"\"\"\n",
    "        参数:\n",
    "        batch_size (int): 用于限制批量的大小。\n",
    "        功能:\n",
    "        初始化了一个空的批量列表 _batch。\n",
    "        设定了初始的最大长度为 -1。\n",
    "        存储了传入的 batch_size。\n",
    "        \"\"\"\n",
    "\n",
    "        self._batch = []  #这个就是之前的batch_size，就是第一个batch内有多少个样本\n",
    "        self.max_len = -1\n",
    "        self._batch_size = batch_size # 限制批量的大小,假设是4096\n",
    "\n",
    "    def append(self, info):\n",
    "        \"\"\"\n",
    "        参数:\n",
    "        info (SampleInfo): 文本对的信息。\n",
    "        功能:\n",
    "        接收一个 SampleInfo 对象，并根据其最大长度信息更新当前批量的最大长度。\n",
    "        如果将新的样本加入批量后超过了批量大小限制，它会返回已有的批量并将新的样本加入新的批量。\n",
    "        否则，它会更新最大长度并将样本添加到当前批量中。\n",
    "        \"\"\"\n",
    "        # 更新当前批量的最大长度\n",
    "        cur_len = info.max_len # 当前样本的长度\n",
    "        max_len = max(self.max_len, cur_len) # 每来一个样本，更新当前批次的最大长度\n",
    "        # 如果新的样本加入批量后超过大小限制，则将已有的批量返回，新的样本加入新的批量\n",
    "        if max_len * (len(self._batch) + 1) > self._batch_size:\n",
    "            self._batch, result = [], self._batch # 保存当前的batch，并返回,这里的result是之前的batch,_batch清空\n",
    "            self._batch.append(info) #箱子里的第一条样本，放入\n",
    "            self.max_len = cur_len #因为是当前batch的第一个样本，所以它的长度就是当前长度\n",
    "            return result\n",
    "        else:\n",
    "            self.max_len = max_len\n",
    "            self._batch.append(info) # 将样本添加到当前批量中\n",
    "            return None\n",
    "\n",
    "    @property\n",
    "    def batch(self):\n",
    "        return self._batch"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:23.149062600Z",
     "start_time": "2024-08-05T08:06:23.013615200Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:19:09.788407Z",
     "iopub.status.busy": "2025-02-07T13:19:09.788071Z",
     "iopub.status.idle": "2025-02-07T13:19:09.796955Z",
     "shell.execute_reply": "2025-02-07T13:19:09.796446Z",
     "shell.execute_reply.started": "2025-02-07T13:19:09.788376Z"
    },
    "id": "_Vtc0gXEN4yB",
    "tags": []
   },
   "outputs": [],
   "source": [
    "from torch.utils.data import BatchSampler\n",
    "import numpy as np\n",
    "\n",
    "\n",
    "class TransformerBatchSampler(BatchSampler):\n",
    "    def __init__(self,\n",
    "                 dataset,\n",
    "                 batch_size,\n",
    "                 shuffle_batch=False,\n",
    "                 clip_last_batch=False,\n",
    "                 seed=0):\n",
    "        \"\"\"\n",
    "        批量采样器\n",
    "        输入:\n",
    "            - dataset: 数据集\n",
    "            - batch_size: 批量大小\n",
    "            - shuffle_batch: 是否对生成的批量进行洗牌\n",
    "            - clip_last_batch: 是否裁剪最后剩下的数据\n",
    "            - seed: 随机数种子\n",
    "        \"\"\"\n",
    "        self._dataset = dataset\n",
    "        self._batch_size = batch_size\n",
    "        self._shuffle_batch = shuffle_batch\n",
    "        self._clip_last_batch = clip_last_batch\n",
    "        self._seed = seed\n",
    "        self._random = np.random\n",
    "        self._random.seed(seed)\n",
    "\n",
    "        self._sample_infos = []\n",
    "        # 根据数据集中的每个样本，创建了对应的 SampleInfo 对象，包含了样本的索引和长度信息。\n",
    "        for i, data in enumerate(self._dataset):\n",
    "            lens = [len(data[0]), len(data[1])] #输入和输出的长度计算放到lens中\n",
    "            self._sample_infos.append(SampleInfo(i, lens))\n",
    "\n",
    "    def __iter__(self):\n",
    "        \"\"\"\n",
    "        对数据集中的样本进行排序，排序规则是先按源语言长度排序，如果相同则按目标语言长度排序。\n",
    "        使用 TokenBatchCreator 逐步组装批量数据，当满足批量大小时返回一个批量的样本信息。\n",
    "        如果不裁剪最后一个批次的数据且存在剩余样本，则将这些样本组成最后一个批次。\n",
    "        如果需要对批量进行洗牌，则对批次进行洗牌操作。\n",
    "        通过迭代器，抛出每个批量的样本在数据集中的索引。\n",
    "        \"\"\"\n",
    "        # 排序，如果源语言长度相同则按照目标语言的长度排列\n",
    "        infos = sorted(self._sample_infos,\n",
    "                       key=lambda x: (x.src_len, x.trg_len))\n",
    "        # 组装批量，所有的batch都放入batch_infos\n",
    "        batch_infos = []\n",
    "        batch_creator = TokenBatchCreator(self._batch_size) # 批量生成器\n",
    "        for info in infos:\n",
    "            batch = batch_creator.append(info)\n",
    "            # 存够一个batch的样本信息后，会把这个batch返回，否则返回为None\n",
    "            if batch is not None:\n",
    "                batch_infos.append(batch)\n",
    "\n",
    "        # 是否抛弃最后批量的文本对\n",
    "        if not self._clip_last_batch and len(batch_creator.batch) != 0:\n",
    "            batch_infos.append(batch_creator.batch) # 最后一个batch\n",
    "\n",
    "        # 打乱batch\n",
    "        if self._shuffle_batch:\n",
    "            self._random.shuffle(batch_infos)\n",
    "\n",
    "        self.batch_number = len(batch_infos)\n",
    "        # print(self.batch_number) #为了理解\n",
    "\n",
    "        # 抛出一个批量的文本对在数据集中的序号\n",
    "        for batch in batch_infos:\n",
    "            batch_indices = [info.i for info in batch] # 批量的样本在数据集中的索引，第一个batch[0,1,.....82]，第二个batch[83,84,85,86,87]\n",
    "            yield batch_indices\n",
    "\n",
    "    def __len__(self):\n",
    "        \"\"\"\n",
    "        返回批量的数量\n",
    "        \"\"\"\n",
    "        if hasattr(self, \"batch_number\"):\n",
    "            return self.batch_number\n",
    "        # 计算批量的数量,没有用到下面的情况，不用看\n",
    "        batch_number = (len(self._dataset) +\n",
    "                        self._batch_size) // self._batch_size\n",
    "        return batch_number"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:23.259543600Z",
     "start_time": "2024-08-05T08:06:23.021123200Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:19:12.551526Z",
     "iopub.status.busy": "2025-02-07T13:19:12.551167Z",
     "iopub.status.idle": "2025-02-07T13:19:12.696227Z",
     "shell.execute_reply": "2025-02-07T13:19:12.695659Z",
     "shell.execute_reply.started": "2025-02-07T13:19:12.551503Z"
    },
    "id": "d00AFRzVN4yC",
    "outputId": "a43c1a14-102f-4cbb-fff1-761cb46e31b3",
    "tags": []
   },
   "outputs": [],
   "source": [
    "sampler = TransformerBatchSampler(train_ds, batch_size=4096, shuffle_batch=True)\n",
    "\n",
    "#为什么这里每个批量的样本对数目不一样呢？长度*batch_number>4096的时候，就会返回上一个batch，然后新的样本加入新的batch,具体要看TokenBatchCreator的44行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:23.319151500Z",
     "start_time": "2024-08-05T08:06:23.259543600Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T13:19:18.058186Z",
     "iopub.status.busy": "2025-02-07T13:19:18.057596Z",
     "iopub.status.idle": "2025-02-07T13:19:18.095020Z",
     "shell.execute_reply": "2025-02-07T13:19:18.094475Z",
     "shell.execute_reply.started": "2025-02-07T13:19:18.058161Z"
    },
    "jupyter": {
     "outputs_hidden": false
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第0批量的数据中含有文本对是：[22854, 21981, 22560, 13878, 1588, 25989, 3800, 26236, 433, 13362, 20666, 12617, 953, 6469, 4049, 25678, 3813, 9946, 14428, 14734, 25916, 20237, 903, 3664, 8436, 17208, 20738, 2881, 8102, 10877, 22240, 22396]，数量为：32\n",
      "第1批量的数据中含有文本对是：[26803, 1714, 4980, 7067, 8642, 9783, 9814, 10126, 11088, 11538, 11573, 13132, 16042, 17656, 20802, 24294, 1802, 2587, 2882, 2918, 3524, 5188, 8662, 8670, 9453, 11510, 11796, 12435, 12489, 12665, 16968, 20870, 21495, 23801, 25937, 27906, 1566, 1839, 1971, 3087, 4664, 5852, 6667, 8574, 9448, 10223, 10631, 11901, 12237, 13252, 16396, 22208, 22461, 26481, 26931, 1075, 1522, 2161, 2450, 3448, 3591, 5148, 6907, 8553, 10217, 12740, 12899, 13067, 13930, 17167, 17767, 18141, 18156, 19753, 21369, 24136, 24503, 26760, 27134, 580, 820, 1018, 1954, 2916, 3931, 5629, 8460, 9161, 11994]，数量为：89\n",
      "第2批量的数据中含有文本对是：[26307, 10071, 4235, 6895, 7573, 10194, 15885, 19301, 24814, 21017, 24819, 4248, 10495, 11255, 16751, 17948, 20416, 2919, 3761, 6732, 23752, 1725, 3675, 3833, 11849, 12684, 15686, 21579, 1727, 14371, 18374, 18671, 20124, 25818, 6141, 9747, 13153, 14522, 15811, 24612, 27168, 27513, 701]，数量为：43\n",
      "第3批量的数据中含有文本对是：[7915, 10319, 13306, 14863, 16503, 17852, 17934, 20188, 24469, 24601, 26495, 27002, 194, 2338, 3015, 3239, 4918, 5325, 5743, 5768, 7333, 8317, 10437, 10810, 12207, 12719, 12801, 13821, 14085, 14588, 15220, 15624, 15761, 15998, 16825, 16985, 21252, 22632, 24944, 26136, 26951, 27447, 660, 1049, 2051, 3962, 4871, 5154, 7132, 7847, 8197, 8445, 8470, 13492, 13587, 18017, 20646, 21002, 21191, 21269, 24437, 25054, 23, 2164, 2470, 2843, 3499, 4632, 4914, 7312, 8579, 9575, 10198, 11008, 13567, 14631, 14821]，数量为：77\n"
     ]
    }
   ],
   "source": [
    "for idx, batch in enumerate(sampler):\n",
    "    print(\"第{}批量的数据中含有文本对是：{}，数量为：{}\".format(idx, batch, len(batch)))\n",
    "    if idx >= 3:\n",
    "        break"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:23.319151500Z",
     "start_time": "2024-08-05T08:06:23.302665100Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T13:19:21.301417Z",
     "iopub.status.busy": "2025-02-07T13:19:21.301070Z",
     "iopub.status.idle": "2025-02-07T13:19:21.305157Z",
     "shell.execute_reply": "2025-02-07T13:19:21.304595Z",
     "shell.execute_reply.started": "2025-02-07T13:19:21.301393Z"
    },
    "jupyter": {
     "outputs_hidden": false
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "529"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(sampler)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Olkaw4JNN4yC"
   },
   "source": [
    "### DataLoader"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:23.319151500Z",
     "start_time": "2024-08-05T08:06:23.311772900Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:19:23.317809Z",
     "iopub.status.busy": "2025-02-07T13:19:23.317486Z",
     "iopub.status.idle": "2025-02-07T13:19:23.322830Z",
     "shell.execute_reply": "2025-02-07T13:19:23.322329Z",
     "shell.execute_reply.started": "2025-02-07T13:19:23.317785Z"
    },
    "id": "rvvuNJIzN4yC",
    "tags": []
   },
   "outputs": [],
   "source": [
    "def collate_fct(batch, tokenizer):\n",
    "    src_words = [pair[0].split() for pair in batch]\n",
    "    trg_words = [pair[1].split() for pair in batch]\n",
    "\n",
    "    # [BOS] src [EOS] [PAD]\n",
    "    encoder_inputs, encoder_inputs_mask = tokenizer.encode(\n",
    "        src_words, padding_first=False, add_bos=True, add_eos=True, return_mask=True\n",
    "        )\n",
    "\n",
    "    # [BOS] trg [PAD]\n",
    "    decoder_inputs = tokenizer.encode(\n",
    "        trg_words, padding_first=False, add_bos=True, add_eos=False, return_mask=False,\n",
    "        )\n",
    "\n",
    "    # trg [EOS] [PAD]\n",
    "    decoder_labels, decoder_labels_mask = tokenizer.encode(\n",
    "        trg_words, padding_first=False, add_bos=False, add_eos=True, return_mask=True\n",
    "        )\n",
    "\n",
    "    return {\n",
    "        \"encoder_inputs\": encoder_inputs.to(device=device),\n",
    "        \"encoder_inputs_mask\": encoder_inputs_mask.to(device=device),\n",
    "        \"decoder_inputs\": decoder_inputs.to(device=device),\n",
    "        \"decoder_labels\": decoder_labels.to(device=device),\n",
    "        \"decoder_labels_mask\": decoder_labels_mask.to(device=device),\n",
    "    }\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:24.107023100Z",
     "start_time": "2024-08-05T08:06:23.321149400Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:19:24.608420Z",
     "iopub.status.busy": "2025-02-07T13:19:24.608121Z",
     "iopub.status.idle": "2025-02-07T13:19:24.831052Z",
     "shell.execute_reply": "2025-02-07T13:19:24.830496Z",
     "shell.execute_reply.started": "2025-02-07T13:19:24.608399Z"
    },
    "id": "5p79gPo5N4yC",
    "outputId": "2b1d43ae-a2ed-4333-8274-50c62c2fc6c9",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "encoder_inputs\n",
      "tensor([[    1,    20,    38,    68,   188,    11,   734,     5,   283,    28,\n",
      "            15,    17,     6,     8,   741,     6,     8,  9018,     4,     3],\n",
      "        [    1,    10,    33,  1510,    17, 14309,    73,     5, 14310,  5235,\n",
      "          5263,    13,     8, 14311,    18,     4,     3,     0,     0,     0]],\n",
      "       device='cuda:0')\n",
      "encoder_inputs_mask\n",
      "tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n",
      "        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1]],\n",
      "       device='cuda:0')\n",
      "decoder_inputs\n",
      "tensor([[    1,    48,   100,   102,   128,   190,    27,   182,    61,     7,\n",
      "          3586,   443,    29,     7,    45,     6,     7,   741,     4],\n",
      "        [    1,     7,    84,  3628,    45,  1805,     7, 14651,    56, 15300,\n",
      "           255,  3915, 10143,  2068,    24,     7,  3086,  6447,     4]],\n",
      "       device='cuda:0')\n",
      "decoder_labels\n",
      "tensor([[   48,   100,   102,   128,   190,    27,   182,    61,     7,  3586,\n",
      "           443,    29,     7,    45,     6,     7,   741,     4,     3],\n",
      "        [    7,    84,  3628,    45,  1805,     7, 14651,    56, 15300,   255,\n",
      "          3915, 10143,  2068,    24,     7,  3086,  6447,     4,     3]],\n",
      "       device='cuda:0')\n",
      "decoder_labels_mask\n",
      "tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n",
      "        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],\n",
      "       device='cuda:0')\n"
     ]
    }
   ],
   "source": [
    "from functools import partial # 固定collate_fct的tokenizer参数\n",
    "\n",
    "#可以调整batch_size,来看最终的bleu\n",
    "sampler = TransformerBatchSampler(train_ds, batch_size=256, shuffle_batch=True)\n",
    "# https://pytorch.org/docs/stable/data.html#torch.utils.data.DataLoader\n",
    "sample_dl = DataLoader(train_ds, batch_sampler=sampler, collate_fn=partial(collate_fct, tokenizer=tokenizer)) #partial函数，固定collate_fct的tokenizer参数\n",
    "\n",
    "for batch in sample_dl:\n",
    "    for key, value in batch.items():\n",
    "        print(key)\n",
    "        print(value)\n",
    "    break"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "0AadtoM3N4yC"
   },
   "source": [
    "## 定义模型\n",
    "\n",
    "- Transformer模型由Embedding、Transformer-Block组成\n",
    "- Embedding包括：\n",
    "    - WordEmbedding\n",
    "    - PositionEmbedding\n",
    "- Transformer-Block包括：\n",
    "    - Self-Attention\n",
    "    - Cross-Attention\n",
    "    - MLP"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "VTl-sSJmN4yD"
   },
   "source": [
    "### Embedding"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:24.109021500Z",
     "start_time": "2024-08-05T08:06:24.106022800Z"
    },
    "ExecutionIndicator": {
     "show": true
    },
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 455
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:19:27.601041Z",
     "iopub.status.busy": "2025-02-07T13:19:27.600675Z",
     "iopub.status.idle": "2025-02-07T13:19:27.813961Z",
     "shell.execute_reply": "2025-02-07T13:19:27.813451Z",
     "shell.execute_reply.started": "2025-02-07T13:19:27.601018Z"
    },
    "id": "y66CxrsBN4yD",
    "outputId": "c703025c-afc5-4012-d8e3-0e9d4ad253ec",
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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dVISv4Z43aR2NNrJyxtvvIGsrCxMmzYN69atQ48ePTB48OCTdvdryKxatQoTJkzA6tWrsWzZMlRUVOCiiy5CcXGxqjN58mS8//77ePPNN7Fq1Srs2bMHV111VRBHXbd88803eOGFF9C9e3dTeWO87sOHD+Pcc8+Fw+HAxx9/jJ9//hn//Oc/ERcXp+pUJyV9Q+PRRx/F888/j2effRYbN27Eo48+isceewzPPPOMqtMYrru4uBg9evTA3LlzfR6vzjWOHDkSGzZswLJly/DBBx/giy++wPjx48/UJQREVdddUlKCdevW4YEHHsC6devw9ttvY9OmTbj88stN9RridZNaUqNMSA2Ifv36GRMmTFA/ezweIzU11Zg1a1YQR3V62bdvnwHAWLVqlWEYhpGfn284HA7jzTffVHU2btxoADCys7ODNcw648iRI0b79u2NZcuWGX/84x+NO+64wzCMxnvd9957rzFgwAC/x71er5GcnGw8/vjjqiw/P99wuVzGv//97zMxxNPC0KFDjb/85S+msquuusoYOXKkYRiN87oBGO+88476uTrX+PPPPxsAjG+++UbV+fjjjw2LxWLs3r37jI29Npx43b5Yu3atAcDYsWOHYRiN47pJzWmUKy/l5eXIyckxpea2Wq3IzMxEdnZ2EEd2ejm+WVB8fDwAICcnBxUVFab70KlTJ7Rs2bJR3IcJEyZg6NChpusDGu91v/fee+jbty+uvvpqNG3aFL169cJLL72kjp8qJX1DpX///li+fDl+/fVXAMD333+PL7/8EhdffDGAxnvdOtW5xuzsbMTGxqJv376qTmZmJqxWK9asWXPGx3y6KCgogMViQWxsLIDQuW5ipt7vsBsIBw4cgMfjOWkX3qSkJPzyyy9BGtXpxev1YtKkSTj33HPRtWtXAEBubi6cTqf6JT9OUlIScnNzgzDKumPx4sVYt24dvvnmm5OONdbr/u233/D8888jKysLf/vb3/DNN9/g9ttvh9PpxOjRo9W1+frcN+Trvu+++1BYWIhOnTrBZrPB4/HgoYcewsiRIwGg0V63TnWuMTc3F02bNjUdt9vtiI+PbzT3obS0FPfeey+uu+46lZgxFK6bnEyjnLyEIhMmTMBPP/2EL7/8MthDOe3s2rULd9xxB5YtW3bGs7IGE6/Xi759++Lhhx8GcGy77p9++gnz5s3D6NGjgzy608d//vMfvP7661i0aBHOOussrF+/HpMmTUJqamqjvm5ipqKiAtdccw0Mw8Dzzz8f7OGQINMoHxs1adIENpvtJHdJXl5ejdNuNwQmTpyIDz74AJ9//jmaN2+uypOTk1FeXo78/HxT/YZ+H3JycrBv3z707t0bdrsddrsdq1atwpw5c2C325GUlNQorzslJQVdunQxlXXu3Bk7d+4EYE5Jr9PQr/vuu+/GfffdhxEjRqBbt27485//jMmTJ2PWrFkAGu9161TnGpOTk08yJFRWVuLQoUMN/j4cn7js2LEDy5YtU6suQOO+buKfRjl5cTqd6NOnD5YvX67KvF4vli9fjoyMjCCOrG4xDAMTJ07EO++8gxUrVqB169am43369IHD4TDdh02bNmHnzp0N+j4MGjQIP/74o8pyun79evTt2xcjR45UujFe97nnnnuSFf7XX39Fq1atAJhT0h/neEr6hnzdJSUlsFrNf6psNhu8Xi+AxnvdOtW5xoyMDOTn5yMnJ0fVWbFiBbxeL9LT08/4mOuK4xOXzZs347PPPkNCQoLpeGO9bnIKgh0xfLpYvHix4XK5jFdeecX4+eefjfHjxxuxsbFGbm5usIdWZ9xyyy1GTEyMsXLlSmPv3r3qVVJSourcfPPNRsuWLY0VK1YY3377rZGRkWFkZGQEcdSnB91tZBiN87rXrl1r2O1246GHHjI2b95svP7660Z4eLjxr3/9S9V55JFHjNjYWOPdd981fvjhB+OKK64wWrdubRw9ejSII68do0ePNpo1a2Z88MEHxrZt24y3337baNKkiXHPPfeoOo3huo8cOWJ89913xnfffWcAMJ588knju+++U66a6lzjkCFDjF69ehlr1qwxvvzyS6N9+/bGddddF6xLqhZVXXd5eblx+eWXG82bNzfWr19v+jtXVlam+miI101qR6OdvBiGYTzzzDNGy5YtDafTafTr189YvXp1sIdUpwDw+Vq4cKGqc/ToUePWW2814uLijPDwcOPKK6809u7dG7xBnyZOnLw01ut+//33ja5duxoul8vo1KmT8eKLL5qOe71e44EHHjCSkpIMl8tlDBo0yNi0aVOQRls3FBYWGnfccYfRsmVLw+12G23atDH+/ve/m/7zagzX/fnnn/v8fR49erRhGNW7xoMHDxrXXXedERkZaURHRxtjxowxjhw5EoSrqT5VXfe2bdv8/p37/PPPVR8N8bpJ7bAYhrZNJSGEEEJIPadRxrwQQgghpPHCyQshhBBCGhScvBBCCCGkQcHJCyGEEEIaFJy8EEIIIaRBwckLIYQQQhoUnLwQQgghpEHByQshpFps374dFosF69evD/ZQCCEhDicvhDQQbrzxRlgsFlgsFjgcDiQlJeHCCy/EggULVJ6fujzXsGHD6rRPQgipKzh5IaQBMWTIEOzduxfbt2/Hxx9/jAsuuAB33HEHLr30UlRWVgZ7eIQQckbg5IWQBoTL5UJycjKaNWuG3r17429/+xveffddfPzxx3jllVcAAPn5+bjpppuQmJiI6OhoDBw4EN9//73qY/r06ejZsydeeOEFtGjRAuHh4bjmmmtQUFCgjr/66qt499131UrPypUrVfvffvsNF1xwAcLDw9GjRw9kZ2efyVtACCGcvBDS0Bk4cCB69OiBt99+GwBw9dVXY9++ffj444+Rk5OD3r17Y9CgQTh06JBqs2XLFvznP//B+++/j6VLl+K7777DrbfeCgC46667cM0116hVnr1796J///6q7d///nfcddddWL9+PTp06IDrrruOqz6EkDMKJy+ENAI6deqE7du348svv8TatWvx5ptvom/fvmjfvj2eeOIJxMbG4q233lL1S0tL8dprr6Fnz54477zz8Mwzz2Dx4sXIzc1FZGQkwsLC1CpPcnIynE6nanvXXXdh6NCh6NChA2bMmIEdO3Zgy5YtwbhsQkiIwskLIY0AwzBgsVjw/fffo6ioCAkJCYiMjFSvbdu2YevWrap+y5Yt0axZM/VzRkYGvF4vNm3adMpzde/eXemUlBQAwL59++rwagghpGrswR4AIaT2bNy4Ea1bt0ZRURFSUlJMMSrHiY2NrZNzORwOpS0WCwDUuduJEEKqgpMXQho4K1aswI8//ojJkyejefPmyM3Nhd1uR1pamt82O3fuxJ49e5CamgoAWL16NaxWKzp27AgAcDqd8Hg8Z2L4hBBSYzh5IaQBUVZWhtzcXHg8HuTl5WHp0qWYNWsWLr30UowaNQpWqxUZGRkYNmwYHnvsMXTo0AF79uzBhx9+iCuvvBJ9+/YFALjdbowePRpPPPEECgsLcfvtt+Oaa65BcnIyACAtLQ2ffPIJNm3ahISEBMTExATzsgkhxAQnL4Q0IJYuXYqUlBTY7XbExcWhR48emDNnDkaPHg2r9VgI20cffYS///3vGDNmDPbv34/k5GScd955SEpKUv20a9cOV111FS655BIcOnQIl156KZ577jl1fNy4cVi5ciX69u2LoqIifP7551Wu5BBCyJnEYhiGEexBEELOHNOnT8eSJUu4zT8hpMFCtxEhhBBCGhScvBBCCCGkQcHHRoQQQghpUHDlhRBCCCENCk5eCCGEENKg4OSFEEIIIQ0KTl4IIYQQ0qDg5IUQQgghDQpOXgghhBDSoODkhRBCCCENCk5eCCGEENKg4OSFEEIIIQ2K/wcnumZWHU5nbgAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "class TransformerEmbedding(nn.Module):\n",
    "    def __init__(self, config):\n",
    "        super().__init__()\n",
    "        # hyper params\n",
    "        self.vocab_size = config[\"vocab_size\"]\n",
    "        self.hidden_size = config[\"d_model\"] # 词向量维度\n",
    "        self.pad_idx = config[\"pad_idx\"]\n",
    "        dropout_rate = config[\"dropout\"]\n",
    "        self.max_length = config[\"max_length\"]\n",
    "\n",
    "        # layers,设置padding_idx可以让pad的词向量全为0\n",
    "        self.word_embedding = nn.Embedding(\n",
    "            self.vocab_size, self.hidden_size, padding_idx=self.pad_idx\n",
    "        )\n",
    "        self.pos_embedding = nn.Embedding(\n",
    "            self.max_length,\n",
    "            self.hidden_size,\n",
    "            _weight=self.get_positional_encoding(\n",
    "                self.max_length, self.hidden_size\n",
    "            ),# 位置编码，权重通过get_positional_encoding函数计算得到\n",
    "        )\n",
    "        self.pos_embedding.weight.requires_grad_(False) # 不更新位置编码的权重\n",
    "        self.dropout = nn.Dropout(dropout_rate) # 随机失活层\n",
    "\n",
    "    def get_word_embedding_weights(self):\n",
    "        return self.word_embedding.weight\n",
    "\n",
    "    # 计算位置信息\n",
    "    @classmethod\n",
    "    def get_positional_encoding(self, max_length, hidden_size):#max_length是最大长度，hidden_size是embedding维度相等\n",
    "        # Compute the positional encodings once in log space.\n",
    "        pe = torch.zeros(max_length, hidden_size) # 初始化位置编码\n",
    "        # .unsqueeze(1) 是将这个一维张量转换为二维张量，即将其形状从 (max_length,) 变为 (max_length, 1)。这个操作在张量的维度上增加了一个维度，使其从一维变为二维，第二维的大小为 1。\n",
    "        position = torch.arange(0, max_length).unsqueeze(1) # 位置信息,从0到max_length-1\n",
    "        div_term = torch.exp(\n",
    "            torch.arange(0, hidden_size, 2)\n",
    "            * -(torch.log(torch.Tensor([10000.0])) / hidden_size)\n",
    "        )# 计算位置编码的权重,为了性能考量（是数学上的对数函数分解）\n",
    "        pe[:, 0::2] = torch.sin(position * div_term)\n",
    "        pe[:, 1::2] = torch.cos(position * div_term)\n",
    "        return pe\n",
    "\n",
    "    def forward(self, input_ids):\n",
    "        # input_ids: [batch_size, seq_len]\n",
    "        seq_len = input_ids.shape[1]\n",
    "        assert (\n",
    "            seq_len <= self.max_length\n",
    "        ), f\"input sequence length should no more than {self.max_length} but got {seq_len}\"\n",
    "\n",
    "        position_ids = torch.arange(seq_len, dtype=torch.long, device=input_ids.device)\n",
    "        position_ids = position_ids.unsqueeze(0).expand_as(input_ids)\n",
    "        # print(position_ids)\n",
    "        # embedding\n",
    "        word_embeds = self.word_embedding(input_ids) # 词嵌入\n",
    "        pos_embeds = self.pos_embedding(position_ids) # 位置编码\n",
    "        embeds = word_embeds + pos_embeds\n",
    "        embeds = self.dropout(embeds)\n",
    "\n",
    "        return embeds\n",
    "\n",
    "\n",
    "def plot_position_embedding(position_embedding):# 绘制位置编码\n",
    "    plt.pcolormesh(position_embedding) # 绘制位置编码矩阵\n",
    "    plt.xlabel('Depth')\n",
    "    plt.ylabel('Position')\n",
    "    plt.colorbar() # 颜色条，-1到1的颜色范围\n",
    "    plt.show()\n",
    "\n",
    "position_embedding = TransformerEmbedding.get_positional_encoding(64, 128)\n",
    "plot_position_embedding(position_embedding)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:24.109021500Z",
     "start_time": "2024-08-05T08:06:24.107023100Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T13:19:29.746641Z",
     "iopub.status.busy": "2025-02-07T13:19:29.746313Z",
     "iopub.status.idle": "2025-02-07T13:19:29.758063Z",
     "shell.execute_reply": "2025-02-07T13:19:29.757504Z",
     "shell.execute_reply.started": "2025-02-07T13:19:29.746617Z"
    },
    "jupyter": {
     "outputs_hidden": false
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([2, 50, 128])"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#随机input，调用TransformerEmbedding\n",
    "config={\n",
    "    \"vocab_size\": 100,\n",
    "    \"d_model\": 128,\n",
    "    \"pad_idx\": 0,\n",
    "    \"max_length\": 64,\n",
    "    \"dropout\": 0.1,\n",
    "}\n",
    "input_ids = torch.randint(0, 100, (2, 50))\n",
    "embeds = TransformerEmbedding(config)(input_ids)\n",
    "embeds.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "wXavO0SNN4yD"
   },
   "source": [
    "### Transformer Block"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "HZL4mu3pN4yD"
   },
   "source": [
    "#### scaled-dot-product-attention"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:24.109021500Z",
     "start_time": "2024-08-05T08:06:24.108022500Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 970
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:20:58.596483Z",
     "iopub.status.busy": "2025-02-07T13:20:58.596126Z",
     "iopub.status.idle": "2025-02-07T13:20:58.615981Z",
     "shell.execute_reply": "2025-02-07T13:20:58.615505Z",
     "shell.execute_reply.started": "2025-02-07T13:20:58.596459Z"
    },
    "id": "U9QwdVQYN4yD",
    "outputId": "b6ae9ac8-c71c-4a7b-fd4b-9c15e92dba2c",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "key_value.shape torch.Size([2, 4, 2])\n",
      "torch.Size([2, 3, 2])\n",
      "torch.Size([2, 2, 3, 4])\n"
     ]
    }
   ],
   "source": [
    "from dataclasses import dataclass\n",
    "from typing import Optional, Tuple\n",
    "\n",
    "Tensor = torch.Tensor\n",
    "\n",
    "@dataclass\n",
    "class AttentionOutput:\n",
    "    hidden_states: Tensor\n",
    "    attn_scores: Tensor\n",
    "\n",
    "class MultiHeadAttention(nn.Module):\n",
    "    def __init__(self, config):\n",
    "        super().__init__()\n",
    "        # hyper params\n",
    "        self.hidden_size = config[\"d_model\"] # 隐藏层大小\n",
    "        self.num_heads = config[\"num_heads\"] # 多头注意力的头数\n",
    "        assert (\n",
    "            self.hidden_size % self.num_heads == 0\n",
    "        ), \"Hidden size must be divisible by num_heads but got {} and {}\".format(\n",
    "            self.hidden_size, self.num_heads\n",
    "        )\n",
    "        self.head_dim = self.hidden_size // self.num_heads # 每个头的维度\n",
    "\n",
    "        # layers\n",
    "        self.Wq = nn.Linear(self.hidden_size, self.hidden_size, bias=False) #第二个self.hidden_size可以*系数\n",
    "        self.Wk = nn.Linear(self.hidden_size, self.hidden_size, bias=False)\n",
    "        self.Wv = nn.Linear(self.hidden_size, self.hidden_size, bias=False)\n",
    "        self.Wo = nn.Linear(self.hidden_size, self.hidden_size, bias=False) # 输出层\n",
    "\n",
    "    def _split_heads(self, x: Tensor) -> Tensor:\n",
    "        bs, seq_len, _ = x.shape #假设输入的维度是[batch_size, seq_len, hidden_size],hidden_size是512\n",
    "        x = x.view(bs, seq_len, self.num_heads, self.head_dim) #num_heads是8，head_dim是64\n",
    "        return x.permute(0, 2, 1, 3) #变换维度，[batch_size, num_heads, seq_len, head_dim]\n",
    "\n",
    "    def _merge_heads(self, x: Tensor) -> Tensor:#将多头注意力的输出合并为一个张量\n",
    "        bs, _, seq_len, _ = x.shape #假设输入的维度是[batch_size, num_heads, seq_len, head_dim]\n",
    "        return x.permute(0, 2, 1, 3).reshape(bs, seq_len, self.hidden_size) # 变换维度，变为[batch_size, seq_len, hidden_size]\n",
    "\n",
    "    def forward(self, querys, keys, values, attn_mask=None) -> AttentionOutput:\n",
    "        # split heads\n",
    "        querys = self._split_heads(self.Wq(querys)) #(batch_size, seq_len,hidden_dim)-->[batch_size, num_heads, seq_len, head_dim]\n",
    "        keys = self._split_heads(self.Wk(keys))#[batch_size, num_heads, seq_len, head_dim]\n",
    "        values = self._split_heads(self.Wv(values))#[batch_size, num_heads, seq_len, head_dim]\n",
    "\n",
    "        # calculate attention scores\n",
    "        qk_logits = torch.matmul(querys, keys.mT) # 计算注意力分数，matmul是矩阵乘法，mT是矩阵转置,qk_logits是[batch_size, num_heads, seq_len, seq_len]\n",
    "        # print(querys.shape[-2], keys.shape[-2])  #3 4\n",
    "        if attn_mask is not None:\n",
    "            attn_mask = attn_mask[:, :, : querys.shape[-2], : keys.shape[-2]]\n",
    "            qk_logits += attn_mask * -1e9 # 给需要mask的地方设置一个负无穷\n",
    "        attn_scores = F.softmax(qk_logits / (self.head_dim**0.5), dim=-1) # 计算注意力分数\n",
    "\n",
    "        # apply attention scores\n",
    "        embeds = torch.matmul(attn_scores, values) # softmax后的结果与value相乘，得到新的表示\n",
    "        embeds = self.Wo(self._merge_heads(embeds)) # 输出层 [batch_size, seq_len, hidden_size]\n",
    "\n",
    "        return AttentionOutput(hidden_states=embeds, attn_scores=attn_scores)\n",
    "\n",
    "mha = MultiHeadAttention({\"num_heads\": 2, \"d_model\": 2})\n",
    "query = torch.randn(2, 3, 2) # [batch_size, seq_len, hidden_size]\n",
    "query /= query.norm(dim=-1, keepdim=True) # 归一化\n",
    "key_value = torch.randn(2, 4, 2)\n",
    "print(f'key_value.shape {key_value.shape}')\n",
    "outputs = mha(query, key_value, key_value) #最终输出shape和query的shape一样\n",
    "print(outputs.hidden_states.shape)\n",
    "print(outputs.attn_scores.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:24.816743500Z",
     "start_time": "2024-08-05T08:06:24.108022500Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T13:21:03.523098Z",
     "iopub.status.busy": "2025-02-07T13:21:03.522725Z",
     "iopub.status.idle": "2025-02-07T13:21:03.759465Z",
     "shell.execute_reply": "2025-02-07T13:21:03.758922Z",
     "shell.execute_reply.started": "2025-02-07T13:21:03.523074Z"
    },
    "jupyter": {
     "outputs_hidden": false
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 4 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plt.subplots() 用于创建子图网格，其维度基于 outputs.attn_scores.shape[:2]。子图的行数和列数似乎由 outputs.attn_scores 的前两个维度确定。\n",
    "fig, axis = plt.subplots(*outputs.attn_scores.shape[:2])\n",
    "for i in range(query.shape[0]):\n",
    "    for j in range(outputs.attn_scores.shape[1]):\n",
    "        # axis[i, j].matshow(outputs.attn_scores[i, j].detach().numpy())：此行使用 Matplotlib 的 matshow 绘制每个 i 和 j 的注意力分数热图。detach().numpy() 将 PyTorch 张量转换为 NumPy 数组以进行可视化。\n",
    "        axis[i, j].matshow(outputs.attn_scores[i, j].detach().numpy())\n",
    "        for x in range(outputs.attn_scores.shape[2]):\n",
    "            for y in range(outputs.attn_scores.shape[3]):\n",
    "                # axis[i, j].text(y, x, f\"{outputs.attn_scores[i, j, x, y]:.2f}\", ha=\"center\", va=\"center\", color=\"w\")：此代码在热图上叠加文本，显示 (x, y) 位置处的注意力分数。格式化部分 f\"{outputs.attn_scores[i, j, x, y]:.2f}\" 确保以两位小数显示注意力分数。文本以白色居中显示在 (y, x) 坐标处。\n",
    "                axis[i, j].text(y, x, f\"{outputs.attn_scores[i, j, x, y]:.2f}\", ha=\"center\", va=\"center\", color=\"w\")\n",
    "fig.suptitle(\"multi head attention without mask\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:25.525550800Z",
     "start_time": "2024-08-05T08:06:24.814755500Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T13:21:06.904284Z",
     "iopub.status.busy": "2025-02-07T13:21:06.903930Z",
     "iopub.status.idle": "2025-02-07T13:21:07.221404Z",
     "shell.execute_reply": "2025-02-07T13:21:07.220880Z",
     "shell.execute_reply.started": "2025-02-07T13:21:06.904261Z"
    },
    "jupyter": {
     "outputs_hidden": false
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------------------------------------------------\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 4 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "print('-'*50)\n",
    "# mask\n",
    "mask = torch.Tensor([[0, 0, 1, 1], [0, 0, 0, 1], [0, 0, 0, 0]]).reshape(1, 1, 3, 4) #手工构造mask\n",
    "outputs_masked = mha(query, key_value, key_value, mask)\n",
    "\n",
    "fig, axis = plt.subplots(*outputs_masked.attn_scores.shape[:2])\n",
    "for i in range(query.shape[0]):\n",
    "    for j in range(outputs_masked.attn_scores.shape[1]):\n",
    "        axis[i, j].matshow(outputs_masked.attn_scores[i, j].detach().numpy())\n",
    "        for x in range(outputs_masked.attn_scores.shape[2]):\n",
    "            for y in range(outputs_masked.attn_scores.shape[3]):\n",
    "                axis[i, j].text(y, x, f\"{outputs_masked.attn_scores[i, j, x, y]:.2f}\", ha=\"center\", va=\"center\", color=\"w\")\n",
    "fig.suptitle(\"multi head attention with mask\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "GkzzrRWVN4yE"
   },
   "source": [
    "#### Transformer-Block"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:25.527550400Z",
     "start_time": "2024-08-05T08:06:25.524551200Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:21:11.958673Z",
     "iopub.status.busy": "2025-02-07T13:21:11.958325Z",
     "iopub.status.idle": "2025-02-07T13:21:11.968631Z",
     "shell.execute_reply": "2025-02-07T13:21:11.968139Z",
     "shell.execute_reply.started": "2025-02-07T13:21:11.958649Z"
    },
    "id": "b16xpL47N4yE",
    "tags": []
   },
   "outputs": [],
   "source": [
    "# 通过使用 @dataclass 装饰器，Python 会自动为该类生成一些方法，如 __init__()、__repr__() 和 __eq__() 等，这些方法可以使类的使用更加方便。\n",
    "@dataclass\n",
    "class TransformerBlockOutput:\n",
    "# hidden_states: Tensor：用于存储某个块产生的隐藏状态。\n",
    "# self_attn_scores: Tensor：包含了自注意力机制（self-attention）所计算得到的注意力分数。\n",
    "# cross_attn_scores: Optional[Tensor] = None：是一个可选字段，存储了交叉注意力（cross-attention）计算得到的注意力分数。这里的 Optional 表示这个字段可以是 Tensor 类型，也可以是 None。\n",
    "    hidden_states: Tensor\n",
    "    self_attn_scores: Tensor\n",
    "    cross_attn_scores: Optional[Tensor] = None\n",
    "\n",
    "class TransformerBlock(nn.Module):\n",
    "    def __init__(self, config, add_cross_attention=False):\n",
    "        super().__init__()\n",
    "        # hyper params\n",
    "        self.hidden_size = config[\"d_model\"]\n",
    "        self.num_heads = config[\"num_heads\"]\n",
    "        dropout_rate = config[\"dropout\"]\n",
    "        ffn_dim = config[\"dim_feedforward\"]\n",
    "        eps = config[\"layer_norm_eps\"] # 层归一化的epsilon值\n",
    "\n",
    "        # self-attention\n",
    "        self.self_atten = MultiHeadAttention(config) # 多头注意力\n",
    "        self.self_ln = nn.LayerNorm(self.hidden_size, eps=eps) #层归一化(层标准化)\n",
    "        self.self_dropout = nn.Dropout(dropout_rate)\n",
    "\n",
    "        # cross-attention，交叉注意力，decoder中使用,因此额外做一个判断\n",
    "        if add_cross_attention:\n",
    "            self.cross_atten = MultiHeadAttention(config)\n",
    "            self.cross_ln = nn.LayerNorm(self.hidden_size, eps=eps)\n",
    "            self.cross_dropout = nn.Dropout(dropout_rate)\n",
    "        else:\n",
    "            self.cross_atten = None\n",
    "\n",
    "        # FFN,前馈神经网络\n",
    "        self.ffn = nn.Sequential(\n",
    "            nn.Linear(self.hidden_size, ffn_dim),\n",
    "            nn.ReLU(),\n",
    "            nn.Linear(ffn_dim, self.hidden_size),\n",
    "        )\n",
    "        self.ffn_ln = nn.LayerNorm(self.hidden_size, eps=eps)\n",
    "        self.ffn_dropout = nn.Dropout(dropout_rate)\n",
    "\n",
    "    def forward(\n",
    "        self,\n",
    "        hidden_states,\n",
    "        attn_mask=None,\n",
    "        encoder_outputs=None,\n",
    "        cross_attn_mask=None,\n",
    "    ):\n",
    "        # self-attention,自注意力\n",
    "        self_atten_output = self.self_atten(\n",
    "            hidden_states, hidden_states, hidden_states, attn_mask\n",
    "        )\n",
    "        self_embeds = self.self_ln(\n",
    "            hidden_states + self.self_dropout(self_atten_output.hidden_states)\n",
    "        ) #多头注意力进行dropout，然后和原始输入进行残差连接，然后进行层归一化\n",
    "\n",
    "        # cross-attention，交叉注意力\n",
    "        if self.cross_atten is not None:\n",
    "            assert encoder_outputs is not None\n",
    "            cross_atten_output = self.cross_atten(\n",
    "                self_embeds, encoder_outputs, encoder_outputs, cross_attn_mask\n",
    "            ) #query是self_embeds，key和value都是encoder_outputs\n",
    "            cross_embeds = self.cross_ln(\n",
    "                self_embeds + self.cross_dropout(cross_atten_output.hidden_states)\n",
    "            ) # 交叉注意力进行dropout，然后和self_embeds进行残差连接，然后进行层归一化\n",
    "\n",
    "        # FFN\n",
    "        embeds = cross_embeds if self.cross_atten is not None else self_embeds # 如果有交叉注意力，则使用交叉注意力的输出作为FFN的输入；否则，使用self_embeds作为FFN的输入\n",
    "        ffn_output = self.ffn(embeds) # 前馈神经网络\n",
    "        embeds = self.ffn_ln(embeds + self.ffn_dropout(ffn_output)) # 前馈神经网络进行dropout，然后和原始输入进行残差连接，然后进行层归一化\n",
    "\n",
    "        return TransformerBlockOutput(\n",
    "            hidden_states=embeds,\n",
    "            self_attn_scores=self_atten_output.attn_scores,\n",
    "            cross_attn_scores=cross_atten_output.attn_scores\n",
    "            if self.cross_atten is not None\n",
    "            else None,\n",
    "        )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "tfJIGaohN4yE"
   },
   "source": [
    "#### Encoder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:25.527550400Z",
     "start_time": "2024-08-05T08:06:25.525550800Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:21:31.092083Z",
     "iopub.status.busy": "2025-02-07T13:21:31.091717Z",
     "iopub.status.idle": "2025-02-07T13:21:31.097973Z",
     "shell.execute_reply": "2025-02-07T13:21:31.097456Z",
     "shell.execute_reply.started": "2025-02-07T13:21:31.092061Z"
    },
    "id": "sTLabHm7N4yE",
    "tags": []
   },
   "outputs": [],
   "source": [
    "from typing import List\n",
    "\n",
    "@dataclass\n",
    "class TransformerEncoderOutput:\n",
    "    last_hidden_states: Tensor\n",
    "    attn_scores: List[Tensor]\n",
    "\n",
    "# https://pytorch.org/docs/stable/generated/torch.nn.Module.html#torch.nn.Module\n",
    "class TransformerEncoder(nn.Module):\n",
    "    def __init__(self, config):\n",
    "        super().__init__()\n",
    "        # hyper params\n",
    "        self.num_layers = config[\"num_encoder_layers\"]\n",
    "\n",
    "        # layers,仅仅是一个模块的列表，它本身没有定义前向传递（forward pass）过程。你需要在 forward 方法中明确地定义如何使用这些模块。\n",
    "        self.layers = nn.ModuleList(\n",
    "            [TransformerBlock(config) for _ in range(self.num_layers)]\n",
    "        )\n",
    "\n",
    "    def forward(\n",
    "        self, encoder_inputs_embeds, attn_mask=None\n",
    "    ) -> TransformerEncoderOutput:\n",
    "        attn_scores = [] # 存储每个层的注意力分数\n",
    "        embeds = encoder_inputs_embeds # 输入的嵌入向量作为第一层的输入(embedding+位置编码)\n",
    "        for layer in self.layers:\n",
    "            block_outputs = layer(embeds, attn_mask=attn_mask)\n",
    "            embeds = block_outputs.hidden_states #上一层的输出作为下一层的输入\n",
    "            # 在每个层的输出中，提取了隐藏状态 block_outputs.hidden_states，并将对应的注意力分数 block_outputs.self_attn_scores 添加到列表 attn_scores 中。\n",
    "            attn_scores.append(block_outputs.self_attn_scores) # 存储每个层的注意力分数,用于画图\n",
    "\n",
    "        return TransformerEncoderOutput(\n",
    "            last_hidden_states=embeds, attn_scores=attn_scores\n",
    "        )\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "BEMNj6eBN4yE"
   },
   "source": [
    "#### Decoder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:25.527550400Z",
     "start_time": "2024-08-05T08:06:25.525550800Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:21:40.969837Z",
     "iopub.status.busy": "2025-02-07T13:21:40.969481Z",
     "iopub.status.idle": "2025-02-07T13:21:40.976392Z",
     "shell.execute_reply": "2025-02-07T13:21:40.975763Z",
     "shell.execute_reply.started": "2025-02-07T13:21:40.969813Z"
    },
    "id": "wCHOur-QN4yE",
    "tags": []
   },
   "outputs": [],
   "source": [
    "@dataclass\n",
    "class TransformerDecoderOutput:\n",
    "    last_hidden_states: Tensor\n",
    "    self_attn_scores: List[Tensor]\n",
    "    cross_attn_scores: List[Tensor]\n",
    "\n",
    "\n",
    "class TransformerDecoder(nn.Module):\n",
    "    def __init__(self, config):\n",
    "        super().__init__()\n",
    "        # hyper params\n",
    "        self.num_layers = config[\"num_decoder_layers\"]\n",
    "\n",
    "        # layers\n",
    "        self.layers = nn.ModuleList(\n",
    "            [\n",
    "                TransformerBlock(config, add_cross_attention=True)\n",
    "                for _ in range(self.num_layers)\n",
    "            ]\n",
    "        )\n",
    "\n",
    "    def forward(\n",
    "        self,\n",
    "        decoder_inputs_embeds,\n",
    "        encoder_outputs,\n",
    "        attn_mask=None,\n",
    "        cross_attn_mask=None,\n",
    "    ) -> TransformerDecoderOutput:\n",
    "        self_attn_scores = [] # 存储每个层的自注意力分数\n",
    "        cross_attn_scores = [] # 存储每个层的交叉注意力分数\n",
    "        embeds = decoder_inputs_embeds # 输入的嵌入向量作为第一层的输入(embedding+位置编码)\n",
    "        for layer in self.layers:\n",
    "            block_outputs = layer(\n",
    "                embeds,\n",
    "                attn_mask=attn_mask, # 自注意力的mask\n",
    "                encoder_outputs=encoder_outputs,\n",
    "                cross_attn_mask=cross_attn_mask, # 交叉注意力的mask\n",
    "            )\n",
    "            embeds = block_outputs.hidden_states # 上一层的输出作为下一层的输入\n",
    "            self_attn_scores.append(block_outputs.self_attn_scores) # 存储每个层的自注意力分数\n",
    "            cross_attn_scores.append(block_outputs.cross_attn_scores) # 存储每个层的交叉注意力分数\n",
    "\n",
    "        return TransformerDecoderOutput(\n",
    "            last_hidden_states=embeds,\n",
    "            self_attn_scores=self_attn_scores,\n",
    "            cross_attn_scores=cross_attn_scores,\n",
    "        )\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "zPrvXAXtN4yF"
   },
   "source": [
    "#### mask\n",
    "\n",
    "- mask实际上大类上只有两种\n",
    "    1. `padding_mask`：mask掉`pad_idx`，不计算损失\n",
    "    2. `attention_mask`：mask掉`pad_idx`，不计算注意力分数\n",
    "- Decoder的`attention_mask`和Encoder有一定的区别：\n",
    "    - Encoder可以同时看见序列所有信息，故只mask掉`pad_idx`\n",
    "    - Decoder只能看到在自身之前的序列的信息，故要额外mask掉自身之后的序列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:25.527550400Z",
     "start_time": "2024-08-05T08:06:25.526551200Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:21:44.990346Z",
     "iopub.status.busy": "2025-02-07T13:21:44.990000Z",
     "iopub.status.idle": "2025-02-07T13:21:44.995392Z",
     "shell.execute_reply": "2025-02-07T13:21:44.994862Z",
     "shell.execute_reply.started": "2025-02-07T13:21:44.990322Z"
    },
    "id": "D2N9VmcAWLn1",
    "outputId": "560b8af9-c854-4fd7-df3e-86e9eb9045cc",
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[False,  True,  True,  True,  True],\n",
       "        [False, False,  True,  True,  True],\n",
       "        [False, False, False,  True,  True],\n",
       "        [False, False, False, False,  True],\n",
       "        [False, False, False, False, False]])"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(torch.triu(torch.ones(5, 5)) == 0).transpose(-1,-2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:26.193720900Z",
     "start_time": "2024-08-05T08:06:25.526551200Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 426
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:21:48.909887Z",
     "iopub.status.busy": "2025-02-07T13:21:48.909509Z",
     "iopub.status.idle": "2025-02-07T13:21:49.062704Z",
     "shell.execute_reply": "2025-02-07T13:21:49.062075Z",
     "shell.execute_reply.started": "2025-02-07T13:21:48.909861Z"
    },
    "id": "QxpSYOsaN4yF",
    "outputId": "1022d3c3-c72e-4798-b998-c71c6690b94e",
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 480x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "def generate_square_subsequent_mask(sz: int) -> Tensor:\n",
    "    \"\"\"\n",
    "    Generate a square mask for the sequence. The masked positions are filled with True.\n",
    "        Unmasked positions are filled with False.\n",
    "    \"\"\"\n",
    "    # torch.ones(sz, sz): 创建一个全为 1 的 sz × sz 的矩阵。\n",
    "    # torch.triu(...): 使用 triu 函数取得矩阵的上三角部分，将主对角线以下部分置零。\n",
    "    mask = (torch.triu(torch.ones(sz, sz)) == 0).transpose(-1, -2).bool()\n",
    "    # mask = torch.triu(torch.ones(sz, sz))\n",
    "    return mask\n",
    "\n",
    "\n",
    "plt.matshow(generate_square_subsequent_mask(16))\n",
    "plt.colorbar()\n",
    "plt.xlabel(\"keys\")\n",
    "plt.ylabel(\"querys\")\n",
    "plt.title(\"1 means mask while 0 means unmask\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:27.178084Z",
     "start_time": "2024-08-05T08:06:25.538543600Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 960
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:21:52.791860Z",
     "iopub.status.busy": "2025-02-07T13:21:52.791483Z",
     "iopub.status.idle": "2025-02-07T13:21:53.290483Z",
     "shell.execute_reply": "2025-02-07T13:21:53.289782Z",
     "shell.execute_reply.started": "2025-02-07T13:21:52.791835Z"
    },
    "id": "cPeMjXO1N4yF",
    "outputId": "e6922ce8-ba71-491f-d7a6-709a14a4b7d7",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['[BOS]', '[UNK]', 'quick', 'brown', '[UNK]', 'jumps', 'over', 'the', '[UNK]', 'dog', '.', '[EOS]']\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1IAAAG1CAYAAADz+MUUAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAASMZJREFUeJzt3X1cVHX+///ncCEiyECGGkpeYWamqUhayoV5gVSu1q5iZoraupm22mptfmxTu5A1s/pWm+Zamkapu2vZthmkiXhV6iaJpa6GEshaXjKocX1+f/Rz1hFUDsLMAI/77XZuwZkz7/frDM68es45c8ZiGIYhAAAAAEClebi6AAAAAACobQhSAAAAAGASQQoAAAAATCJIAQAAAIBJBCkAAAAAMIkgBQAAAAAmEaQAAAAAwCSCFAAAAACYRJACAAAAAJMIUsBlLFu2TBaLRUeOHHFYP3/+fLVt21aenp7q2rWrS2qrD2bPni2LxaITJ064uhQAKOdyPaK6JCQkyN/fv0bGrsiF/dm1a5fT5ryaC32gtqKP1X0EKcCElJQUPfnkk+rdu7eWLl2quXPnVuv427Zt0+zZs3XmzJlyt82dO1cfffRRtc4HAACAqiFIASZ88cUX8vDw0Ntvv63Ro0fr7rvvrtbxt23bpjlz5hCkAAAA3BxBCjDhp59+kq+vrxo0aODqUgAAAOBCBCnUOfn5+Zo6dapat24tHx8fNW3aVAMGDNDXX39t3+arr77SoEGDZLVa1ahRI0VHR2vr1q1XHNdisWjp0qU6d+6cLBaLLBaLli1bVqma9uzZo4SEBLVt21YNGzZU8+bNNW7cOJ08edK+zezZs/XEE09Iktq0aWOf48iRI7JYLDp37pzeffdd+/qEhAT7/SwWiw4dOqSEhAQFBgbKarVq7NixOn/+vKnH7sI5+T/88IPuvfde+fv7q0WLFvrLX/4iScrIyNBdd90lPz8/tWrVSu+//77D/U+dOqXp06erc+fO8vf3V0BAgOLi4vTNN9+Um+v1119Xp06d1KhRIwUFBalHjx7lxrtUVlaWwsLCdOutt+rHH380tW8AUNPefPNNderUST4+PgoJCdGkSZMqPMPgb3/7m8LDw+Xr66vrr79eo0aN0tGjR686fnp6uoKDgxUTE6OzZ89WqqasrCw9+uij6tChg3x9fdWkSRMNGzbssp/tKiws1B/+8AcFBwfLz89P9913n44fP15uu3Xr1ikyMlJ+fn5q3Lix7rnnHn377bcO21Sm912wZcsWRUREqGHDhmrXrp3eeuutSu3fpehjcCYvVxcAVLdHHnlEf//73zV58mTdcsstOnnypLZs2aJ9+/ape/fu+uKLLxQXF6fw8HDNmjVLHh4eWrp0qe666y5t3rxZt99+e4XjrlixQosXL9aOHTu0ZMkSSdKdd95ZqZo+//xzZWZmauzYsWrevLm+/fZbLV68WN9++62+/PJLWSwW3X///frPf/6jDz74QK+88oquv/56SVJwcLBWrFihhx9+WLfffrsmTJggSWrXrp3DHMOHD1ebNm2UmJior7/+WkuWLFHTpk01b948U49faWmp4uLiFBUVpRdffFFJSUmaPHmy/Pz8NHPmTD344IO6//77tWjRIo0ePVp33HGH2rRpI0nKzMzURx99pGHDhqlNmzb68ccf9dZbbyk6OlrfffedQkJCJEl//etf9fvf/16/+c1vNGXKFBUUFGjPnj366quvNHLkyArr+v7773XXXXfpuuuu0+eff25/fADAHcyePVtz5sxR//79NXHiRB04cEALFy7Uzp07tXXrVnl7e0v65aIOY8eOVUREhBITE/Xjjz/q//2//6etW7dq9+7dCgwMrHD8nTt3KjY2Vj169NDatWvl6+tbqbp27typbdu2acSIEWrZsqWOHDmihQsXKiYmRt99950aNWrksP1jjz2moKAgzZo1S0eOHNGrr76qyZMna9WqVfZtVqxYoTFjxig2Nlbz5s3T+fPntXDhQvXp00e7d+9W69atJVWu90m/hJuBAwcqODhYs2fPVklJiWbNmqVmzZqZ/Cv8gj4GpzGAOsZqtRqTJk2q8LaysjKjffv2RmxsrFFWVmZff/78eaNNmzbGgAED7OuWLl1qSDIOHz5sXzdmzBjDz8/PdE3nz58vt+6DDz4wJBlpaWn2dfPnzy835wV+fn7GmDFjyq2fNWuWIckYN26cw/r77rvPaNKkiak6x4wZY0gy5s6da193+vRpw9fX17BYLMbKlSvt6/fv329IMmbNmmVfV1BQYJSWljqMefjwYcPHx8d49tln7euGDBlidOrU6Yq1XNiv48ePG/v27TNCQkKMiIgI49SpU6b2CQBqwsU94qeffjIaNGhgDBw40OE18I033jAkGe+8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",
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------------------------------------------------\n",
      "['[BOS]', '[UNK]', 'does', 'the', '[UNK]', 'say', '?', '[EOS]', '[PAD]', '[PAD]', '[PAD]', '[PAD]']\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1AAAAG1CAYAAAD3DRUpAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAR7tJREFUeJzt3XtcVHX+x/E3iAKCM1jhhSBTM80yLbz9VGTE5NJlKfNuq6ibm9qGpW766OKtJCPTLlvKumkXNzOl2s1IvOElLW1T0U1dy0sgWpoK3kAu5/fHPphlAvGAODPA6/l4zGOZM2e+n89hhXcfzswZD8MwDAEAAAAArsjT1Q0AAAAAQHXBAAUAAAAAJjFAAQAAAIBJDFAAAAAAYBIDFAAAAACYxAAFAAAAACYxQAEAAACASQxQAAAAAGASAxQAAAAAmMQABZRh8eLF8vDw0OHDhx22JyYmqkWLFqpTp446dOjgkt5qg2nTpsnDw0MnT550dSsAUMrlMqKqxMXFyd/f/5qsXZbi4/n222+dVvNKinOguiLHajYGKMCk1NRU/fnPf1b37t21aNEizZo1q0rX37Jli6ZNm6YzZ86UemzWrFn69NNPq7QeAAAAKo4BCjBp3bp18vT01N/+9jcNGzZM9957b5Wuv2XLFk2fPp0BCgAAwI0xQAEm/fLLL/L19VW9evVc3QoAAABchAEKNcrZs2c1fvx43XzzzfL29lajRo3Up08ffffdd/Z9vvnmG0VHR8tqtap+/foKDw/XV199Ve66Hh4eWrRokc6fPy8PDw95eHho8eLFpnpKT09XXFycWrRoIR8fHzVp0kQjR47Ur7/+at9n2rRpmjRpkiSpefPm9hqHDx+Wh4eHzp8/r3fffde+PS4uzv48Dw8P/fDDD4qLi1NAQICsVqtGjBihCxcuVOh7V/ya+59++kn333+//P39deONN+ovf/mLJGn37t2KiIiQn5+fmjVrpr///e8Ozz916pQmTpyodu3ayd/fXxaLRTExMdq1a1epWm+88YZuv/121a9fXw0bNlTHjh1LrfdbR44c0S233KI77rhDP//8c4WODQCutbfeeku33367vL29FRQUpHHjxpX5ioKPP/5YoaGh8vX11Q033KBHHnlER48eveL6O3fuVGBgoGw2m86dO2eqpyNHjmjs2LFq3bq1fH19df3116t///6Xfe9WXl6ennrqKQUGBsrPz08PPfSQTpw4UWq/lJQUhYWFyc/PTw0aNNB9992nf//73w77mMm+Yps3b1anTp3k4+Ojli1basGCBaaO77fIMTiLl6sbAKrSY489puXLl+vxxx9X27Zt9euvv2rz5s3au3ev7r77bq1bt04xMTEKDQ3V1KlT5enpqUWLFikiIkKbNm1S586dy1z3/fffV1JSkrZt26aFCxdKkrp162aqp9WrV+vgwYMaMWKEmjRpon//+99KSkrSv//9b3399dfy8PBQ37599Z///Ecffvih5s6dqxtuuEGSFBgYqPfff19/+MMf1LlzZ40ePVqS1LJlS4caAwYMUPPmzZWQkKDvvvtOCxcuVKNGjTR79uwKff8KCwsVExOjnj176uWXX9aSJUv0+OOPy8/PT88884yGDh2qvn37av78+Ro2bJj+7//+T82bN5ckHTx4UJ9++qn69++v5s2b6+eff9aCBQsUHh6u77//XkFBQZKkv/71r3riiSfUr18/xcfHKzc3V+np6frmm280ZMiQMvv68ccfFRERoeuuu06rV6+2f38AwB1MmzZN06dP1z333KMxY8Zo//79evvtt7V9+3Z99dVXqlu3rqT/XqxhxIgR6tSpkxISEvTzzz/rtdde01dffaUdO3YoICCgzPW3b9+uqKgodezYUZ999pl8fX1N9bV9+3Zt2bJFgwYNUnBwsA4fPqy3335bNptN33//verXr++w/5/+9Cc1bNhQU6dO1eHDhzVv3jw9/vjj+uijj+z7vP/++xo+fLiioqI0e/ZsXbhwQW+//bZ69OihHTt26Oabb5ZkLvuk/w41kZGRCgwM1LRp01RQUKCpU6eqcePGFfx/4b/IMTiFAdQgVqvVGDduXJmPFRUVGa1atTKioqKMoqIi+/YLFy4YzZs3N/r06WPftmjRIkOScejQIfu24cOHG35+fhXu6cKFC6W2ffjhh4YkY+PGjfZtiYmJpWoW8/PzM4YPH15q+9SpUw1JxsiRIx22P/TQQ8b1119foT6HDx9uSDJmzZpl33b69GnD19fX8PDwMJYuXWrfvm/fPkOSMXXqVPu23Nxco7Cw0GHNQ4cOGd7e3saMGTPs22JjY43bb7+93F6Kj+vEiRPG3r17jaCgIKNTp07GqVOnKnRMAHAtlMyIX375xahXr54RGRnp8DvwzTff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PfXBBx/owQcf1IABA/TFF1+U+ustALhKYGCgpkyZounTpys6Olq/+93vtH//fr311lvq1KmTHnnkEUlS3bp1NXv2bI0YMULh4eEaPHiw/TLmN998s5588sky1/f19dXnn3+uiIgIxcTEaMOGDbrjjjtM9Xb//ffr/fffl9VqVdu2bbV161atWbNG119/faWO1WKx6O2339bvf/973X333Ro0aJACAwP1008/aeXKlerevbvefPPNCmXf9OnT9eWXXyosLExjx45VQUGB/TOW0tPTK9VnZZFjMM01F/8Dql5eXp4xadIko3379kaDBg0MPz8/o3379sZbb73lsN+OHTuMvn37Gtdff73h7e1tNGvWzBgwYICxdu1a+z5VeRnzzMxM46GHHjICAgIMq9Vq9O/f38jKyip1+VTDMIyZM2caN954o+Hp6elQf9++fUbPnj0NX19fQ5L9kuYlL5NaUln9X8nlji88PLzMy7U2a9bMuO++++z3c3NzjQkTJhhNmzY1fH19je7duxtbt241wsPDjfDwcPt+CxYsMHr27Gn//rds2dKYNGmSkZ2dbd+nrOO6cOGCER4ebvj7+xtff/216eMCgKpW1u/YN99802jTpo1Rt25do3HjxsaYMWOM06dPl3ruRx99ZNx1112Gt7e3cd111xlDhw41MjMzHfYp6/fxyZMnjbZt2xpNmjQxDhw4YKrP06dPGyNGjDBuuOEGw9/f34iKijL27dtnNGvWzOGjMYqPZ/v27Q7PX79+vSHJWL9+fantUVFRhtVqNXx8fIyWLVsacXFxxrfffmvfpyLZt2HDBiM0NNSoV6+e0aJFC2P+/Pn2HKgIcgzO4mEYFXyXOQAAAADUUrwHCgAAAABM4j1QQCVlZ2fr4sWL5e5T1mVena269AkAMOfcuXNlXgyppMDAwMteuru6IcfgbngJH1BJcXFxevfdd8vdxx1+vKpLnwAAc6ZNm1bq84Z+69ChQ7r55pud09A1Ro7B3TBAAZX0/fffKysrq9x9nPV5U+WpLn0CAMw5ePCgDh48WO4+PXr0cPg8ouqMHIO7YYACAAAAAJO4iAQAAAAAmMQABQAAAAAmMUDBbs+ePYqLi3NqzcOHDys1NVWS1LFjR6fWrq2++eYbde/eXXfffbc++OADV7cDAJflilySyCZXIJtQnTBAlZCWlqaQkBAlJSXJ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",
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------------------------------------------------\n"
     ]
    }
   ],
   "source": [
    "#通过下面代码查看mask的效果\n",
    "inputs_words = [\"The quick brown fox jumps over the lazy dog .\", \"What does the fox say ?\"]\n",
    "\n",
    "inputs_ids, input_mask = tokenizer.encode([w.split() for w in inputs_words], return_mask=True)\n",
    "for i in range(len(inputs_words)):\n",
    "    decode_text = tokenizer.decode(inputs_ids[i: i+1].tolist(), remove_bos=False, remove_eos=False, remove_pad=False, split=True)[0]\n",
    "    print(decode_text)\n",
    "    self_attn_mask  = input_mask[i].reshape(1, -1).repeat_interleave(inputs_ids.shape[-1], dim=0)\n",
    "    look_ahead_mask = generate_square_subsequent_mask(inputs_ids.shape[-1])\n",
    "\n",
    "    fig, axs = plt.subplots(1, 2, figsize=(10, 5))\n",
    "    axs[0].matshow(self_attn_mask)\n",
    "    axs[0].set_title(\"self_attn_mask\")\n",
    "    axs[0].set_yticks(range(len(decode_text)), decode_text, fontsize=6)\n",
    "    axs[0].set_ylabel(\"querys\")\n",
    "    axs[0].set_xticks(range(len(decode_text)), decode_text, fontsize=6)\n",
    "    axs[0].set_xlabel(\"keys\")\n",
    "    axs[1].matshow(look_ahead_mask)\n",
    "    axs[1].set_title(\"look_ahead_mask\")\n",
    "    axs[1].set_yticks(range(len(decode_text)), decode_text, fontsize=6)\n",
    "    axs[1].set_ylabel(\"querys\")\n",
    "    axs[1].set_xticks(range(len(decode_text)), decode_text, fontsize=6)\n",
    "    axs[1].set_xlabel(\"keys\")\n",
    "    plt.show()\n",
    "    print('-'*50)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:27.179078300Z",
     "start_time": "2024-08-05T08:06:26.513547400Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T13:21:57.545845Z",
     "iopub.status.busy": "2025-02-07T13:21:57.545482Z",
     "iopub.status.idle": "2025-02-07T13:21:57.551388Z",
     "shell.execute_reply": "2025-02-07T13:21:57.550868Z",
     "shell.execute_reply.started": "2025-02-07T13:21:57.545821Z"
    },
    "jupyter": {
     "outputs_hidden": false
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[False,  True,  True,  True,  True],\n",
       "        [False, False,  True,  True,  True],\n",
       "        [False, False, False,  True,  True],\n",
       "        [False, False, False, False,  True],\n",
       "        [False, False, False, False, False]])"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(torch.triu(torch.ones(5, 5)) == 0).transpose(-1, -2).bool()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:27.234057200Z",
     "start_time": "2024-08-05T08:06:27.159090100Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T13:22:00.334540Z",
     "iopub.status.busy": "2025-02-07T13:22:00.334164Z",
     "iopub.status.idle": "2025-02-07T13:22:00.339480Z",
     "shell.execute_reply": "2025-02-07T13:22:00.338842Z",
     "shell.execute_reply.started": "2025-02-07T13:22:00.334516Z"
    },
    "jupyter": {
     "outputs_hidden": false
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([5, 1, 4, 4])"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#帮我随机两个[5, 1, 1, 4]与[1, 1, 4, 4]尺寸的张量，并求和\n",
    "a = torch.randn(5, 1, 1, 4)\n",
    "b = torch.randn(1, 1, 4, 4)\n",
    "(a + b).shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "TelCDOoEN4yF"
   },
   "source": [
    "#### Transformer Model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:27.234057200Z",
     "start_time": "2024-08-05T08:06:27.160089800Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:22:05.129194Z",
     "iopub.status.busy": "2025-02-07T13:22:05.128722Z",
     "iopub.status.idle": "2025-02-07T13:22:05.147245Z",
     "shell.execute_reply": "2025-02-07T13:22:05.146717Z",
     "shell.execute_reply.started": "2025-02-07T13:22:05.129163Z"
    },
    "id": "oFGNt8FPN4yF",
    "tags": []
   },
   "outputs": [],
   "source": [
    "@dataclass\n",
    "class TransformerOutput:\n",
    "    logits: Tensor\n",
    "    encoder_last_hidden_states: Tensor\n",
    "    encoder_attn_scores: List[Tensor] #画图\n",
    "    decoder_last_hidden_states: Tensor\n",
    "    decoder_self_attn_scores: List[Tensor] #画图\n",
    "    decoder_cross_attn_scores: List[Tensor] #画图\n",
    "    preds: Optional[Tensor] = None\n",
    "\n",
    "class TransformerModel(nn.Module):\n",
    "    def __init__(self, config):\n",
    "        super().__init__()\n",
    "        # hyper params\n",
    "        self.hidden_size = config[\"d_model\"]\n",
    "        self.num_encoder_layers = config[\"num_encoder_layers\"]\n",
    "        self.num_decoder_layers = config[\"num_decoder_layers\"]\n",
    "        self.pad_idx = config[\"pad_idx\"]\n",
    "        self.bos_idx = config[\"bos_idx\"]\n",
    "        self.eos_idx = config[\"eos_idx\"]\n",
    "        self.vocab_size = config[\"vocab_size\"]\n",
    "        self.dropout_rate = config[\"dropout\"]\n",
    "        self.max_length = config[\"max_length\"]\n",
    "        self.share = config[\"share_embedding\"]\n",
    "\n",
    "        # layers\n",
    "        self.src_embedding = TransformerEmbedding(config) # 输入的嵌入层\n",
    "        if self.share:#如果共享词嵌入，则使用src_embedding作为trg_embedding\n",
    "            self.trg_embedding = self.src_embedding #源和目标的嵌入层相同，共享参数，节省内存\n",
    "            self.linear = lambda x: torch.matmul(\n",
    "                x, self.trg_embedding.get_word_embedding_weights().T\n",
    "            ) # 输出层，共享参数，直接拿原有embedding矩阵的转置，节省内存\n",
    "        else:\n",
    "            self.trg_embedding = TransformerEmbedding(config) #decoder模块的嵌入层\n",
    "            self.linear = nn.Linear(self.hidden_size, self.vocab_size) # 输出层\n",
    "\n",
    "        self.encoder = TransformerEncoder(config)\n",
    "        self.decoder = TransformerDecoder(config)\n",
    "\n",
    "        # init weights\n",
    "        self._init_weights()\n",
    "\n",
    "    def _init_weights(self):\n",
    "        \"\"\"使用 xavier 均匀分布来初始化权重\"\"\"\n",
    "        for p in self.parameters():\n",
    "            if p.dim() > 1:\n",
    "                nn.init.xavier_uniform_(p)\n",
    "\n",
    "    def generate_square_subsequent_mask(self, sz: int) -> Tensor:\n",
    "        \"\"\"\n",
    "        Generate a square mask for the sequence. The masked positions are filled with True.\n",
    "            Unmasked positions are filled with False.为了生成斜三角的mask\n",
    "        \"\"\"\n",
    "        mask = (torch.triu(torch.ones(sz, sz)) == 0).transpose(-1, -2).bool()\n",
    "\n",
    "        return mask\n",
    "\n",
    "    def forward(\n",
    "        self, encoder_inputs, decoder_inputs, encoder_inputs_mask=None\n",
    "    ) -> TransformerOutput:\n",
    "        # encoder_inputs: [batch_size, src_len]\n",
    "        # decoder_inputs: [batch_size, trg_len]\n",
    "        # encoder_inputs_mask: [batch_size, src_len]\n",
    "        if encoder_inputs_mask is None:\n",
    "            encoder_inputs_mask = encoder_inputs.eq(self.pad_idx) # [batch_size, src_len]\n",
    "        encoder_inputs_mask = encoder_inputs_mask.unsqueeze(1).unsqueeze(\n",
    "            2\n",
    "        )  # [batch_size, 1, 1, src_len],用于encoder的自注意力\n",
    "        look_ahead_mask = self.generate_square_subsequent_mask(decoder_inputs.shape[1])\n",
    "        look_ahead_mask = (\n",
    "            look_ahead_mask.unsqueeze(0).unsqueeze(0).to(decoder_inputs.device)\n",
    "        )  #[trg_len, trg_len]--> [1, 1, trg_len, trg_len],用于decoder的自注意力\n",
    "        #增加decoder_inputs_mask和look_ahead_mask进行组合\n",
    "        decoder_inputs_mask = decoder_inputs.eq(self.pad_idx) # [batch_size, trg_len]，和上面encoder_inputs_mask一致\n",
    "        # print(decoder_inputs_mask.shape)\n",
    "        decoder_inputs_mask = decoder_inputs_mask.unsqueeze(1).unsqueeze(2)  # [batch_size, 1, 1, trg_len]\n",
    "        # print(decoder_inputs_mask.shape)\n",
    "        decoder_inputs_mask = decoder_inputs_mask + look_ahead_mask # [batch_size, 1, 1, trg_len]与[1, 1, trg_len, trg_len]相加，得到decoder的自注意力mask\n",
    "\n",
    "        # encoding\n",
    "        encoder_inputs_embeds = self.src_embedding(encoder_inputs)\n",
    "        encoder_outputs = self.encoder(encoder_inputs_embeds, encoder_inputs_mask) #encoder_inputs_mask用于encoder的自注意力,广播去做计算\n",
    "\n",
    "        # decoding\n",
    "        decoder_inputs_embeds = self.trg_embedding(decoder_inputs)\n",
    "        decoder_outputs = self.decoder(\n",
    "            decoder_inputs_embeds=decoder_inputs_embeds,\n",
    "            encoder_outputs=encoder_outputs.last_hidden_states,\n",
    "            attn_mask=decoder_inputs_mask, #用于decoder的自注意力,广播去做计算\n",
    "            cross_attn_mask=encoder_inputs_mask,#用于decoder的交叉注意力,广播去做计算\n",
    "        )\n",
    "\n",
    "        logits = self.linear(decoder_outputs.last_hidden_states) # [batch_size, trg_len, vocab_size]\n",
    "\n",
    "        return TransformerOutput(\n",
    "            logits=logits,\n",
    "            encoder_last_hidden_states=encoder_outputs.last_hidden_states,\n",
    "            encoder_attn_scores=encoder_outputs.attn_scores,\n",
    "            decoder_last_hidden_states=decoder_outputs.last_hidden_states,\n",
    "            decoder_self_attn_scores=decoder_outputs.self_attn_scores,\n",
    "            decoder_cross_attn_scores=decoder_outputs.cross_attn_scores,\n",
    "        )\n",
    "\n",
    "    @torch.no_grad()\n",
    "    def infer(self, encoder_inputs, encoder_inputs_mask=None) -> Tensor:\n",
    "        # assert len(encoder_inputs.shape) == 2 and encoder_inputs.shape[0] == 1\n",
    "        if encoder_inputs_mask is None:#应对多个样本同时进行推理\n",
    "            encoder_inputs_mask = encoder_inputs.eq(self.pad_idx)\n",
    "        encoder_inputs_mask = encoder_inputs_mask.unsqueeze(1).unsqueeze(2)  # [batch_size, 1, 1, src_len],[1,src_len]相加时，会自动广播到[batch_size,1,src_len,src_len]\n",
    "        look_ahead_mask = self.generate_square_subsequent_mask(self.max_length)\n",
    "        look_ahead_mask = (\n",
    "            look_ahead_mask.unsqueeze(0).unsqueeze(0).to(encoder_inputs.device)\n",
    "        )  # [1, 1, trg_len, trg_len]\n",
    "\n",
    "        # encoding\n",
    "        encoder_inputs_embeds = self.src_embedding(encoder_inputs)\n",
    "        encoder_outputs = self.encoder(encoder_inputs_embeds) #因为只支持单样本预测，没有paddings，所以不需要mask\n",
    "\n",
    "        # decoding,多样本推理\n",
    "        decoder_inputs = torch.Tensor([self.bos_idx] * encoder_inputs.shape[0]).reshape(-1, 1).long().to(device=encoder_inputs.device)\n",
    "        for cur_len in tqdm(range(1, self.max_length + 1)):\n",
    "            decoder_inputs_embeds = self.trg_embedding(decoder_inputs)\n",
    "            decoder_outputs = self.decoder(\n",
    "                decoder_inputs_embeds=decoder_inputs_embeds,\n",
    "                encoder_outputs=encoder_outputs.last_hidden_states,\n",
    "                attn_mask=look_ahead_mask[:, :, :cur_len, :cur_len],#decoder的自注意力mask\n",
    "            )\n",
    "\n",
    "            logits = self.linear(decoder_outputs.last_hidden_states)\n",
    "            next_token = logits.argmax(dim=-1)[:, -1:] #通过最大下标确定类别，[:, -1:]表示取最后一个结果\n",
    "            decoder_inputs = torch.cat([decoder_inputs, next_token], dim=-1) #预测输出拼接到输入中\n",
    "            #(decoder_inputs == self.eos_idx).sum(dim=-1)是判断样本中是否含有EOS标记\n",
    "            #all是每一个都为True，才会结束\n",
    "            if all((decoder_inputs == self.eos_idx).sum(dim=-1) > 0):\n",
    "                break\n",
    "\n",
    "        return TransformerOutput(\n",
    "            preds=decoder_inputs[:, 1:],\n",
    "            logits=logits,\n",
    "            encoder_last_hidden_states=encoder_outputs.last_hidden_states,\n",
    "            encoder_attn_scores=encoder_outputs.attn_scores,\n",
    "            decoder_last_hidden_states=decoder_outputs.last_hidden_states,\n",
    "            decoder_self_attn_scores=decoder_outputs.self_attn_scores,\n",
    "            decoder_cross_attn_scores=decoder_outputs.cross_attn_scores,\n",
    "        )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "kXHQ3sGTN4yG"
   },
   "source": [
    "## 训练"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "OxNA8DIzN4yG"
   },
   "source": [
    "### 损失函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:27.234057200Z",
     "start_time": "2024-08-05T08:06:27.160089800Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:22:09.624162Z",
     "iopub.status.busy": "2025-02-07T13:22:09.623799Z",
     "iopub.status.idle": "2025-02-07T13:22:09.629137Z",
     "shell.execute_reply": "2025-02-07T13:22:09.628452Z",
     "shell.execute_reply.started": "2025-02-07T13:22:09.624139Z"
    },
    "id": "1xzahHANN4yG",
    "tags": []
   },
   "outputs": [],
   "source": [
    "class CrossEntropyWithPadding:\n",
    "    def __init__(self, config):\n",
    "        self.label_smoothing = config[\"label_smoothing\"]\n",
    "\n",
    "    def __call__(self, logits, labels, padding_mask=None):\n",
    "        # logits.shape = [batch size, sequence length, num of classes]\n",
    "        # labels.shape = [batch size, sequence length]\n",
    "        # padding_mask.shape = [batch size, sequence length]\n",
    "        bs, seq_len, nc = logits.shape\n",
    "        loss = F.cross_entropy(logits.reshape(bs * seq_len, nc), labels.reshape(-1), reduce=False, label_smoothing=self.label_smoothing) #label_smoothing表示随机将一个类别的概率设置为0.1，使得模型更加关注其他类别\n",
    "        if padding_mask is None:\n",
    "            loss = loss.mean()\n",
    "        else:\n",
    "            padding_mask = 1 - padding_mask.reshape(-1) #将padding_mask reshape成一维张量，mask部分为0，非mask部分为1\n",
    "            loss = torch.mul(loss, padding_mask).sum() / padding_mask.sum()\n",
    "\n",
    "        return loss\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "zuBC9KqFN4yG"
   },
   "source": [
    "### 学习率衰减"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:27.235056800Z",
     "start_time": "2024-08-05T08:06:27.160089800Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T13:22:13.216758Z",
     "iopub.status.busy": "2025-02-07T13:22:13.216398Z",
     "iopub.status.idle": "2025-02-07T13:22:13.334989Z",
     "shell.execute_reply": "2025-02-07T13:22:13.334535Z",
     "shell.execute_reply.started": "2025-02-07T13:22:13.216724Z"
    },
    "jupyter": {
     "outputs_hidden": false
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f445ae944f0>]"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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YrEwbdo0Xn75ZXr27Em3bt148cUX6dixI6NGjaq/mYqIiEijZXdhiY+P58yZM8yePZucnBwiIiJYv3591UWz2dnZuLn964mbYcOGsXTpUl544QVmzZpFz549Wb16Nf37968a89xzz1FcXMwTTzzBhQsXuOWWW1i/fj0+PrpmREREROrwPizOqiHfh0VEREQaRoO8D4uIiIiII6iwiIiIiNNTYRERERGnp8IiIiIiTk+FRURERJyeCouIiIg4PRUWERERcXoqLCIiIuL0VFhERETE6dn91vzO6rs37C0sLHRwEhEREamt787b13vjfZcpLEVFRQAEBwc7OImIiIjYq6ioCH9//6ve7zKfJWSz2Th16hS+vr5YLJZ6e9zCwkKCg4M5fvy4S35GkavPD1x/jq4+P3D9OWp+jZ+rz7Eh52eMoaioiI4dO1b78OTvc5lnWNzc3OjcuXODPb6fn59L/hB+x9XnB64/R1efH7j+HDW/xs/V59hQ87vWMyvf0UW3IiIi4vRUWERERMTpqbBch7e3N3PmzMHb29vRURqEq88PXH+Orj4/cP05an6Nn6vP0Rnm5zIX3YqIiIjr0jMsIiIi4vRUWERERMTpqbCIiIiI01NhEREREaenwnIdixcvJiQkBB8fH6Kjo9m6daujI13h17/+NRaLpdotNDS06v7S0lImTpxI27ZtadmyJQ8++CC5ubnVHiM7O5uRI0fSvHlz2rdvz/Tp06msrKw2ZuPGjURFReHt7U2PHj14++23G2Q+X3zxBffccw8dO3bEYrGwevXqavcbY5g9ezYdOnSgWbNmxMbGcuDAgWpjzp07x9ixY/Hz86NVq1Y89thjXLx4sdqYHTt2cOutt+Lj40NwcDC///3vr8iycuVKQkND8fHxISwsjHXr1t2QOf7sZz+74pjeeeedjWaOSUlJDB48GF9fX9q3b8+oUaPYt29ftTE38ueyvn+PazO/22+//Ypj+OSTTzaK+QG88cYbDBgwoOqNwmJiYvj444+r7m/Mx68282vsx+/75s6di8ViYdq0aVXbGt0xNHJVy5cvN15eXuavf/2r2bVrl3n88cdNq1atTG5urqOjVTNnzhzTr18/c/r06arbmTNnqu5/8sknTXBwsElJSTHbtm0zQ4cONcOGDau6v7Ky0vTv39/ExsaajIwMs27dOhMQEGBmzpxZNebw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QECAycvLM8Zcfulaly5dzGeffWa2bdtmYmJiTExMTNX+37107Y477jCZmZlm/fr1pl27djW+dG369Olmz549ZvHixQ32suaioiKTkZFhMjIyDGBee+01k5GRYY4dO2aMufyy5latWpkPP/zQ7Nixw9x33301vqw5MjLSfPPNN+bLL780PXv2rPaS3wsXLpjAwEDz6KOPmqysLLN8+XLTvHnzK17y6+HhYebNm2f27Nlj5syZU28va77WHIuKisyzzz5rUlNTzZEjR8ynn35qoqKiTM+ePU1paWmjmONTTz1l/P39zcaNG6u9LLSkpKRqzI36uWyI3+Prze/gwYPmN7/5jdm2bZs5cuSI+fDDD0337t3Nbbfd1ijmZ4wxM2bMMJs2bTJHjhwxO3bsMDNmzDAWi8X885//NMY07uN3vfm5wvGryfdf+dTYjqEKy3UsWrTIdOnSxXh5eZkhQ4aYr7/+2tGRrhAfH286dOhgvLy8TKdOnUx8fLw5ePBg1f2XLl0yv/zlL03r1q1N8+bNzf33329Onz5d7TGOHj1q7rrrLtOsWTMTEBBgnnnmGVNRUVFtzOeff24iIiKMl5eX6d69u3nrrbcaZD6ff/65Aa64jR8/3hhz+aXNL774ogkMDDTe3t5mxIgRZt++fdUe4+zZsyYhIcG0bNnS+Pn5mQkTJpiioqJqY7Zv325uueUW4+3tbTp16mTmzp17RZZ3333X9OrVy3h5eZl+/fqZjz76qMHnWFJSYu644w7Trl074+npabp27Woef/zxK365nXmONc0NqPYzcyN/Luv79/h688vOzja33XabadOmjfH29jY9evQw06dPr/Y+Hs48P2OM+fnPf266du1qvLy8TLt27cyIESOqyooxjfv4XW9+rnD8avL9wtLYjqHFGGPse05GRERE5MbSNSwiIiLi9FRYRERExOmpsIiIiIjTU2ERERERp6fCIiIiIk5PhUVEREScngqLiIiIOD0VFhEREXF6KiwiIiLi9FRYRERExOmpsIiIiIjTU2ERERERp/d/WvhGRCRCR7sAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x=np.arange(1, 40000)\n",
    "plt.plot(x, x * (4000 ** (-1.5)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:27.235056800Z",
     "start_time": "2024-08-05T08:06:27.161089200Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T13:22:17.560340Z",
     "iopub.status.busy": "2025-02-07T13:22:17.559989Z",
     "iopub.status.idle": "2025-02-07T13:22:17.564301Z",
     "shell.execute_reply": "2025-02-07T13:22:17.563835Z",
     "shell.execute_reply.started": "2025-02-07T13:22:17.560317Z"
    },
    "jupyter": {
     "outputs_hidden": false
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "22.627416997969522"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.sqrt(512)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:27.235056800Z",
     "start_time": "2024-08-05T08:06:27.161089200Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 449
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:22:18.440544Z",
     "iopub.status.busy": "2025-02-07T13:22:18.440192Z",
     "iopub.status.idle": "2025-02-07T13:22:18.545826Z",
     "shell.execute_reply": "2025-02-07T13:22:18.545293Z",
     "shell.execute_reply.started": "2025-02-07T13:22:18.440521Z"
    },
    "id": "UQPiKK4nN4yG",
    "outputId": "63cfb132-ef75-4f94-f0c8-86a2f36e09c2",
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# NoamDecayScheduler 是一个自定义或外部定义的学习率衰减调度器类。它需要接收配置 config 作为参数，可能实现了特定的学习率衰减方案\n",
    "class NoamDecayScheduler:\n",
    "    def __init__(self, config):\n",
    "        self.d_model = config[\"d_model\"]\n",
    "        self.warmup_steps = config[\"warmup_steps\"]\n",
    "\n",
    "    def __call__(self, step):\n",
    "        step += 1\n",
    "        arg1 = step ** (-0.5) #4000步之后是arg1\n",
    "        arg2 = step * (self.warmup_steps ** (-1.5))  #4000步之前是arg2\n",
    "\n",
    "        arg3 = self.d_model ** (-0.5)\n",
    "\n",
    "        return arg3 * np.minimum(arg1, arg2)\n",
    "\n",
    "\n",
    "temp_learning_rate_schedule = NoamDecayScheduler({\"d_model\": 512, \"warmup_steps\": 4000})\n",
    "#下面是学习率的设计图\n",
    "plt.plot(temp_learning_rate_schedule(np.arange(0, 40000)))\n",
    "plt.ylabel(\"Leraning rate\")\n",
    "plt.xlabel(\"Train step\")\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "XHj_EjzlN4yW"
   },
   "source": [
    "### 优化器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:27.240054200Z",
     "start_time": "2024-08-05T08:06:27.161089200Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:22:21.792249Z",
     "iopub.status.busy": "2025-02-07T13:22:21.791896Z",
     "iopub.status.idle": "2025-02-07T13:22:21.796467Z",
     "shell.execute_reply": "2025-02-07T13:22:21.795963Z",
     "shell.execute_reply.started": "2025-02-07T13:22:21.792225Z"
    },
    "id": "1EVLKx2rN4yW",
    "tags": []
   },
   "outputs": [],
   "source": [
    "from torch.optim.lr_scheduler import LambdaLR\n",
    "from torch.optim import Adam\n",
    "\n",
    "def get_optimizer(model, config):\n",
    "    base_lr = 0.1\n",
    "    beta1 = config[\"beta1\"] # Adam 的 beta1\n",
    "    beta2 = config[\"beta2\"] # Adam 的 beta2\n",
    "    eps = config[\"eps\"]\n",
    "    optimizer = Adam(model.parameters(), lr=base_lr, betas=(beta1, beta2), eps=eps)\n",
    "    lr_scheduler = NoamDecayScheduler(config) #config是一个字典，包含了学习率衰减的参数\n",
    "    # 使用 LambdaLR 调度器，它可以根据给定的函数 lr_lambda 调整学习率。这里将 lr_scheduler 作为函数传递给 LambdaLR，它包含了特定于模型或任务的学习率调度规则\n",
    "    scheduler = LambdaLR(optimizer, lr_lambda=lr_scheduler)\n",
    "    return optimizer, scheduler"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "JBhiO7O2N4yW"
   },
   "source": [
    "### Callback"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:36.478359Z",
     "start_time": "2024-08-05T08:06:27.161089200Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:22:24.513760Z",
     "iopub.status.busy": "2025-02-07T13:22:24.513404Z",
     "iopub.status.idle": "2025-02-07T13:22:28.865320Z",
     "shell.execute_reply": "2025-02-07T13:22:28.864772Z",
     "shell.execute_reply.started": "2025-02-07T13:22:24.513722Z"
    },
    "id": "rWFMJwBkN4yX",
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025-02-07 21:22:25.312115: I tensorflow/core/util/port.cc:153] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.\n",
      "2025-02-07 21:22:25.734641: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:477] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n",
      "WARNING: All log messages before absl::InitializeLog() is called are written to STDERR\n",
      "E0000 00:00:1738934545.879825    1506 cuda_dnn.cc:8310] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n",
      "E0000 00:00:1738934545.919287    1506 cuda_blas.cc:1418] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n",
      "2025-02-07 21:22:26.281819: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n",
      "To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n"
     ]
    }
   ],
   "source": [
    "from torch.utils.tensorboard import SummaryWriter\n",
    "\n",
    "\n",
    "class TensorBoardCallback:\n",
    "    def __init__(self, log_dir, flush_secs=10):\n",
    "        \"\"\"\n",
    "        Args:\n",
    "            log_dir (str): dir to write log.\n",
    "            flush_secs (int, optional): write to dsk each flush_secs seconds. Defaults to 10.\n",
    "        \"\"\"\n",
    "        self.writer = SummaryWriter(log_dir=log_dir, flush_secs=flush_secs)\n",
    "\n",
    "    def draw_model(self, model, input_shape):\n",
    "        self.writer.add_graph(model, input_to_model=torch.randn(input_shape))\n",
    "\n",
    "    def add_loss_scalars(self, step, loss, val_loss):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/loss\",\n",
    "            tag_scalar_dict={\"loss\": loss, \"val_loss\": val_loss},\n",
    "            global_step=step,\n",
    "            )\n",
    "\n",
    "    def add_acc_scalars(self, step, acc, val_acc):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/accuracy\",\n",
    "            tag_scalar_dict={\"accuracy\": acc, \"val_accuracy\": val_acc},\n",
    "            global_step=step,\n",
    "        )\n",
    "\n",
    "    def add_lr_scalars(self, step, learning_rate):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/learning_rate\",\n",
    "            tag_scalar_dict={\"learning_rate\": learning_rate},\n",
    "            global_step=step,\n",
    "\n",
    "        )\n",
    "\n",
    "    def __call__(self, step, **kwargs):\n",
    "        # add loss\n",
    "        loss = kwargs.pop(\"loss\", None)\n",
    "        val_loss = kwargs.pop(\"val_loss\", None)\n",
    "        if loss is not None and val_loss is not None:\n",
    "            self.add_loss_scalars(step, loss, val_loss)\n",
    "        # add acc\n",
    "        acc = kwargs.pop(\"acc\", None)\n",
    "        val_acc = kwargs.pop(\"val_acc\", None)\n",
    "        if acc is not None and val_acc is not None:\n",
    "            self.add_acc_scalars(step, acc, val_acc)\n",
    "        # add lr\n",
    "        learning_rate = kwargs.pop(\"lr\", None)\n",
    "        if learning_rate is not None:\n",
    "            self.add_lr_scalars(step, learning_rate)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:36.486389200Z",
     "start_time": "2024-08-05T08:06:36.483880700Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:22:28.866543Z",
     "iopub.status.busy": "2025-02-07T13:22:28.866173Z",
     "iopub.status.idle": "2025-02-07T13:22:28.871698Z",
     "shell.execute_reply": "2025-02-07T13:22:28.871242Z",
     "shell.execute_reply.started": "2025-02-07T13:22:28.866521Z"
    },
    "id": "64y_NBHMN4yX",
    "tags": []
   },
   "outputs": [],
   "source": [
    "class SaveCheckpointsCallback:\n",
    "    def __init__(self, save_dir, save_step=5000, save_best_only=True):\n",
    "        \"\"\"\n",
    "        Save checkpoints each save_epoch epoch.\n",
    "        We save checkpoint by epoch in this implementation.\n",
    "        Usually, training scripts with pytorch evaluating model and save checkpoint by step.\n",
    "\n",
    "        Args:\n",
    "            save_dir (str): dir to save checkpoint\n",
    "            save_epoch (int, optional): the frequency to save checkpoint. Defaults to 1.\n",
    "            save_best_only (bool, optional): If True, only save the best model or save each model at every epoch.\n",
    "        \"\"\"\n",
    "        self.save_dir = save_dir\n",
    "        self.save_step = save_step\n",
    "        self.save_best_only = save_best_only\n",
    "        self.best_metrics = - np.inf\n",
    "\n",
    "        # mkdir\n",
    "        if not os.path.exists(self.save_dir):\n",
    "            os.mkdir(self.save_dir)\n",
    "\n",
    "    def __call__(self, step, state_dict, metric=None):\n",
    "        if step % self.save_step > 0:\n",
    "            return\n",
    "\n",
    "        if self.save_best_only:\n",
    "            assert metric is not None\n",
    "            if metric >= self.best_metrics:\n",
    "                # save checkpoints\n",
    "                torch.save(state_dict, os.path.join(self.save_dir, \"best.ckpt\"))\n",
    "                # update best metrics\n",
    "                self.best_metrics = metric\n",
    "        else:\n",
    "            torch.save(state_dict, os.path.join(self.save_dir, f\"{step}.ckpt\"))\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:36.523266500Z",
     "start_time": "2024-08-05T08:06:36.494383100Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:22:30.524880Z",
     "iopub.status.busy": "2025-02-07T13:22:30.524542Z",
     "iopub.status.idle": "2025-02-07T13:22:30.529351Z",
     "shell.execute_reply": "2025-02-07T13:22:30.528842Z",
     "shell.execute_reply.started": "2025-02-07T13:22:30.524856Z"
    },
    "id": "Uk4PEb70N4yX",
    "tags": []
   },
   "outputs": [],
   "source": [
    "class EarlyStopCallback:\n",
    "    def __init__(self, patience=5, min_delta=0.01):\n",
    "        \"\"\"\n",
    "\n",
    "        Args:\n",
    "            patience (int, optional): Number of epochs with no improvement after which training will be stopped.. Defaults to 5.\n",
    "            min_delta (float, optional): Minimum change in the monitored quantity to qualify as an improvement, i.e. an absolute\n",
    "                change of less than min_delta, will count as no improvement. Defaults to 0.01.\n",
    "        \"\"\"\n",
    "        self.patience = patience\n",
    "        self.min_delta = min_delta\n",
    "        self.best_metric = - np.inf\n",
    "        self.counter = 0\n",
    "\n",
    "    def __call__(self, metric):\n",
    "        if metric >= self.best_metric + self.min_delta:\n",
    "            # update best metric\n",
    "            self.best_metric = metric\n",
    "            # reset counter\n",
    "            self.counter = 0\n",
    "        else:\n",
    "            self.counter += 1\n",
    "\n",
    "    @property\n",
    "    def early_stop(self):\n",
    "        return self.counter >= self.patience\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "_AB84Qx1N4yX"
   },
   "source": [
    "### training & valuating"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:36.525265400Z",
     "start_time": "2024-08-05T08:06:36.503642Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:22:33.940578Z",
     "iopub.status.busy": "2025-02-07T13:22:33.940250Z",
     "iopub.status.idle": "2025-02-07T13:22:33.945048Z",
     "shell.execute_reply": "2025-02-07T13:22:33.944554Z",
     "shell.execute_reply.started": "2025-02-07T13:22:33.940554Z"
    },
    "id": "1mKPSFkON4yX",
    "tags": []
   },
   "outputs": [],
   "source": [
    "@torch.no_grad()\n",
    "def evaluating(model, dataloader, loss_fct):\n",
    "    loss_list = []\n",
    "    for batch in dataloader:\n",
    "        encoder_inputs = batch[\"encoder_inputs\"]\n",
    "        encoder_inputs_mask = batch[\"encoder_inputs_mask\"]\n",
    "        decoder_inputs = batch[\"decoder_inputs\"]\n",
    "        decoder_labels = batch[\"decoder_labels\"]\n",
    "        decoder_labels_mask = batch[\"decoder_labels_mask\"]\n",
    "\n",
    "        # 前向计算\n",
    "        outputs = model(\n",
    "            encoder_inputs=encoder_inputs,\n",
    "            decoder_inputs=decoder_inputs,\n",
    "            encoder_inputs_mask=encoder_inputs_mask\n",
    "            )\n",
    "        logits = outputs.logits\n",
    "        loss = loss_fct(logits, decoder_labels, padding_mask=decoder_labels_mask)         # 验证集损失\n",
    "        loss_list.append(loss.cpu().item())\n",
    "\n",
    "    return np.mean(loss_list)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:36.549252Z",
     "start_time": "2024-08-05T08:06:36.514271Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:22:37.169248Z",
     "iopub.status.busy": "2025-02-07T13:22:37.168639Z",
     "iopub.status.idle": "2025-02-07T13:22:37.178324Z",
     "shell.execute_reply": "2025-02-07T13:22:37.177815Z",
     "shell.execute_reply.started": "2025-02-07T13:22:37.169210Z"
    },
    "id": "PClBmtgWN4yY",
    "tags": []
   },
   "outputs": [],
   "source": [
    "# 训练\n",
    "def training(\n",
    "    model,\n",
    "    train_loader,\n",
    "    val_loader,\n",
    "    epoch,\n",
    "    loss_fct,\n",
    "    optimizer,\n",
    "    scheduler=None,\n",
    "    tensorboard_callback=None,\n",
    "    save_ckpt_callback=None,\n",
    "    early_stop_callback=None,\n",
    "    eval_step=500,\n",
    "    ):\n",
    "    record_dict = {\n",
    "        \"train\": [],\n",
    "        \"val\": []\n",
    "    }\n",
    "\n",
    "    global_step = 1\n",
    "    model.train()\n",
    "    with tqdm(total=epoch * len(train_loader)) as pbar:\n",
    "        for epoch_id in range(epoch):\n",
    "            # training\n",
    "            for batch in train_loader:\n",
    "                encoder_inputs = batch[\"encoder_inputs\"]\n",
    "                encoder_inputs_mask = batch[\"encoder_inputs_mask\"]\n",
    "                decoder_inputs = batch[\"decoder_inputs\"]\n",
    "                decoder_labels = batch[\"decoder_labels\"]\n",
    "                decoder_labels_mask = batch[\"decoder_labels_mask\"]\n",
    "                # 梯度清空\n",
    "                optimizer.zero_grad()\n",
    "\n",
    "                # 前向计算\n",
    "                outputs = model(\n",
    "                    encoder_inputs=encoder_inputs,\n",
    "                    decoder_inputs=decoder_inputs,\n",
    "                    encoder_inputs_mask=encoder_inputs_mask\n",
    "                    )\n",
    "                logits = outputs.logits\n",
    "                loss = loss_fct(logits, decoder_labels, padding_mask=decoder_labels_mask)\n",
    "\n",
    "                # 梯度回传\n",
    "                loss.backward()\n",
    "\n",
    "                # 调整优化器，包括学习率的变动等\n",
    "                optimizer.step()\n",
    "                if scheduler is not None:\n",
    "                    scheduler.step() # 更新学习率\n",
    "\n",
    "                loss = loss.cpu().item()\n",
    "                # record\n",
    "                record_dict[\"train\"].append({\n",
    "                    \"loss\": loss, \"step\": global_step\n",
    "                })\n",
    "\n",
    "                # evaluating\n",
    "                if global_step % eval_step == 0:\n",
    "                    model.eval()\n",
    "                    val_loss = evaluating(model, val_loader, loss_fct)\n",
    "                    record_dict[\"val\"].append({\n",
    "                        \"loss\": val_loss, \"step\": global_step\n",
    "                    })\n",
    "                    model.train()\n",
    "\n",
    "                    # 1. 使用 tensorboard 可视化\n",
    "                    cur_lr = optimizer.param_groups[0][\"lr\"] if scheduler is None else scheduler.get_last_lr()[0]\n",
    "                    if tensorboard_callback is not None:\n",
    "                        tensorboard_callback(\n",
    "                            global_step,\n",
    "                            loss=loss, val_loss=val_loss,\n",
    "                            lr=cur_lr,\n",
    "                            )\n",
    "\n",
    "                    # 2. 保存模型权重 save model checkpoint\n",
    "                    if save_ckpt_callback is not None:\n",
    "                        save_ckpt_callback(global_step, model.state_dict(), metric=-val_loss)\n",
    "\n",
    "                    # 3. 早停 Early Stop\n",
    "                    if early_stop_callback is not None:\n",
    "                        early_stop_callback(-val_loss)\n",
    "                        if early_stop_callback.early_stop:\n",
    "                            print(f\"Early stop at epoch {epoch_id} / global_step {global_step}\")\n",
    "                            return record_dict\n",
    "\n",
    "                # udate step\n",
    "                global_step += 1\n",
    "                pbar.update(1)\n",
    "            pbar.set_postfix({\"epoch\": epoch_id, \"loss\": loss, \"val_loss\": val_loss})\n",
    "\n",
    "    return record_dict\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:36.628920Z",
     "start_time": "2024-08-05T08:06:36.541257800Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:22:41.557053Z",
     "iopub.status.busy": "2025-02-07T13:22:41.556697Z",
     "iopub.status.idle": "2025-02-07T13:22:41.798131Z",
     "shell.execute_reply": "2025-02-07T13:22:41.797622Z",
     "shell.execute_reply.started": "2025-02-07T13:22:41.557027Z"
    },
    "id": "khZqMS8pN4yY",
    "outputId": "2367a363-585b-4321-f7ea-cb11d9623008",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "load train dataset from wmt16/.cache/de2en_train_128.npy\n",
      "load val dataset from wmt16/.cache/de2en_val_128.npy\n"
     ]
    }
   ],
   "source": [
    "#模型的超参\n",
    "config = {\n",
    "    \"bos_idx\": 1,\n",
    "    \"eos_idx\": 3,\n",
    "    \"pad_idx\": 0,\n",
    "    \"vocab_size\": len(word2idx),\n",
    "    \"max_length\": 128,\n",
    "    \"d_model\": 512,\n",
    "    \"dim_feedforward\": 2048, # FFN 的隐藏层大小\n",
    "    \"dropout\": 0.1,\n",
    "    \"layer_norm_eps\": 1e-6, # 层归一化的 epsilon, 防止除零错误\n",
    "    \"num_heads\": 8,\n",
    "    \"num_decoder_layers\": 6,\n",
    "    \"num_encoder_layers\": 6,\n",
    "    \"label_smoothing\": 0.1,\n",
    "    \"beta1\": 0.9, # Adam 的 beta1\n",
    "    \"beta2\": 0.98,\n",
    "    \"eps\": 1e-9,\n",
    "    \"warmup_steps\": 4_000,\n",
    "    \"share_embedding\": False, # 是否共享词向量\n",
    "    }\n",
    "\n",
    "\n",
    "def get_dl(dataset, batch_size, shuffle=True):\n",
    "    sampler = TransformerBatchSampler(dataset, batch_size=batch_size, shuffle_batch=shuffle)\n",
    "    sample_dl = DataLoader(dataset, batch_sampler=sampler, collate_fn=partial(collate_fct, tokenizer=tokenizer))\n",
    "    return sample_dl\n",
    "\n",
    "# dataset\n",
    "train_ds = LangPairDataset(\"train\", max_length=config[\"max_length\"])\n",
    "val_ds = LangPairDataset(\"val\", max_length=config[\"max_length\"])\n",
    "# tokenizer\n",
    "tokenizer = Tokenizer(word2idx=word2idx, idx2word=idx2word, max_length=config[\"max_length\"])\n",
    "batch_size = 2048\n",
    "# dataloader\n",
    "train_dl = get_dl(train_ds, batch_size=batch_size, shuffle=True)\n",
    "val_dl = get_dl(val_ds, batch_size=batch_size, shuffle=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:52:53.233851300Z",
     "start_time": "2024-08-05T08:52:51.458743700Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T13:22:46.623048Z",
     "iopub.status.busy": "2025-02-07T13:22:46.622702Z",
     "iopub.status.idle": "2025-02-07T13:22:47.583463Z",
     "shell.execute_reply": "2025-02-07T13:22:47.582922Z",
     "shell.execute_reply.started": "2025-02-07T13:22:46.623024Z"
    },
    "jupyter": {
     "outputs_hidden": false
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "模型参数量: 71932091\n"
     ]
    }
   ],
   "source": [
    "#计算模型参数量\n",
    "model = TransformerModel(config)\n",
    "print(f\"模型参数量: {sum(p.numel() for p in model.parameters() if p.requires_grad)}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-07T08:52:38.372364400Z",
     "start_time": "2024-05-07T08:52:38.191467100Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:22:49.695155Z",
     "iopub.status.busy": "2025-02-07T13:22:49.694827Z",
     "iopub.status.idle": "2025-02-07T13:22:49.699240Z",
     "shell.execute_reply": "2025-02-07T13:22:49.698763Z",
     "shell.execute_reply.started": "2025-02-07T13:22:49.695132Z"
    },
    "id": "63slV04gWLn8",
    "outputId": "5c5ede03-0f6f-48d5-a177-d961886ec340",
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'bos_idx': 1,\n",
       " 'eos_idx': 3,\n",
       " 'pad_idx': 0,\n",
       " 'vocab_size': 18107,\n",
       " 'max_length': 128,\n",
       " 'd_model': 512,\n",
       " 'dim_feedforward': 2048,\n",
       " 'dropout': 0.1,\n",
       " 'layer_norm_eps': 1e-06,\n",
       " 'num_heads': 8,\n",
       " 'num_decoder_layers': 6,\n",
       " 'num_encoder_layers': 6,\n",
       " 'label_smoothing': 0.1,\n",
       " 'beta1': 0.9,\n",
       " 'beta2': 0.98,\n",
       " 'eps': 1e-09,\n",
       " 'warmup_steps': 4000,\n",
       " 'share_embedding': False}"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "config"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 49,
     "referenced_widgets": [
      "55146ac7395840dca847e0f63aa80561",
      "abb9bc76c0ce4634bd340be20c074b8c",
      "a89d790df59245fcaf26335d4903c9b4",
      "f837255914194dc792cf1514dee03dc5",
      "46a51a1719d8444eb5877720253d3c37",
      "013d2a6b90144432bbfb15136235faba",
      "2b82e42c34804b13bc83be4c7009d4e2",
      "9233439bdd6746c28ad4a20ef47799f6",
      "0e10428326bc436e8dbc079e89570bde",
      "0fe4ed7283c04496affe727c235d31c4",
      "0c0c7229347b49ffbb9a0f7bd41199b9"
     ]
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:22:51.680145Z",
     "iopub.status.busy": "2025-02-07T13:22:51.679816Z",
     "iopub.status.idle": "2025-02-07T13:22:54.424201Z",
     "shell.execute_reply": "2025-02-07T13:22:54.423650Z",
     "shell.execute_reply.started": "2025-02-07T13:22:51.680122Z"
    },
    "id": "tVO2zJ04N4yY",
    "outputId": "7d4079f5-65d4-4da1-9001-91aa5525250e",
    "tags": []
   },
   "outputs": [],
   "source": [
    "epoch = 100\n",
    "\n",
    "# model\n",
    "model = TransformerModel(config)\n",
    "# 1. 定义损失函数 采用交叉熵损失\n",
    "loss_fct = CrossEntropyWithPadding(config)\n",
    "# 2. 定义优化器 采用 adam\n",
    "# Optimizers specified in the torch.optim package\n",
    "optimizer, scheduler = get_optimizer(model, config)\n",
    "\n",
    "# 1. tensorboard 可视化\n",
    "if not os.path.exists(\"runs\"):\n",
    "    os.mkdir(\"runs\")\n",
    "exp_name = \"translate-transformer-{}\".format(\"share\" if config[\"share_embedding\"] else \"not-share\")\n",
    "tensorboard_callback = TensorBoardCallback(f\"runs/{exp_name}\")\n",
    "# tensorboard_callback.draw_model(model, [1, MAX_LENGTH])\n",
    "# 2. save best\n",
    "if not os.path.exists(\"checkpoints\"):\n",
    "    os.makedirs(\"checkpoints\")\n",
    "save_ckpt_callback = SaveCheckpointsCallback(\n",
    "    f\"checkpoints/{exp_name}\", save_step=500, save_best_only=True)\n",
    "# 3. early stop\n",
    "early_stop_callback = EarlyStopCallback(patience=10,min_delta=0.001)\n",
    "\n",
    "model = model.to(device)\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "# We trained the base models for a total of 100,000 steps or 12 hours. For our big models,(described on the bottom line of table 3), step time was 1.0 seconds. The big models were trained for 300,000 steps (3.5 days)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:22:58.565897Z",
     "iopub.status.busy": "2025-02-07T13:22:58.565322Z",
     "iopub.status.idle": "2025-02-07T13:46:28.780093Z",
     "shell.execute_reply": "2025-02-07T13:46:28.779578Z",
     "shell.execute_reply.started": "2025-02-07T13:22:58.565872Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  0%|          | 0/1400 [00:00<?, ?it/s]/usr/local/lib/python3.10/site-packages/torch/nn/_reduction.py:51: UserWarning: size_average and reduce args will be deprecated, please use reduction='none' instead.\n",
      "  warnings.warn(warning.format(ret))\n",
      "35999it [23:30, 25.53it/s, epoch=33, loss=2.85, val_loss=3.44]                        "
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Early stop at epoch 34 / global_step 36000\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "record = training(\n",
    "    model,\n",
    "    train_dl,\n",
    "    val_dl,\n",
    "    epoch,\n",
    "    loss_fct,\n",
    "    optimizer,\n",
    "    scheduler,\n",
    "    tensorboard_callback=tensorboard_callback,\n",
    "    save_ckpt_callback=save_ckpt_callback,\n",
    "    early_stop_callback=early_stop_callback,\n",
    "    eval_step=500\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-07T13:49:33.186387Z",
     "iopub.status.busy": "2025-02-07T13:49:33.186040Z",
     "iopub.status.idle": "2025-02-07T13:49:33.240353Z",
     "shell.execute_reply": "2025-02-07T13:49:33.239856Z",
     "shell.execute_reply.started": "2025-02-07T13:49:33.186361Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'train': [{'loss': 9.800666809082031, 'step': 1},\n",
       "  {'loss': 9.833541870117188, 'step': 2},\n",
       "  {'loss': 9.836250305175781, 'step': 3},\n",
       "  {'loss': 9.831427574157715, 'step': 4},\n",
       "  {'loss': 9.817290306091309, 'step': 5},\n",
       "  {'loss': 9.817137718200684, 'step': 6},\n",
       "  {'loss': 9.827961921691895, 'step': 7},\n",
       "  {'loss': 9.818708419799805, 'step': 8},\n",
       "  {'loss': 9.836275100708008, 'step': 9},\n",
       "  {'loss': 9.813343048095703, 'step': 10},\n",
       "  {'loss': 9.805685997009277, 'step': 11},\n",
       "  {'loss': 9.844253540039062, 'step': 12},\n",
       "  {'loss': 9.813931465148926, 'step': 13},\n",
       "  {'loss': 9.80605411529541, 'step': 14},\n",
       "  {'loss': 9.823348045349121, 'step': 15},\n",
       "  {'loss': 9.822917938232422, 'step': 16},\n",
       "  {'loss': 9.785002708435059, 'step': 17},\n",
       "  {'loss': 9.80927562713623, 'step': 18},\n",
       "  {'loss': 9.799845695495605, 'step': 19},\n",
       "  {'loss': 9.803289413452148, 'step': 20},\n",
       "  {'loss': 9.789511680603027, 'step': 21},\n",
       "  {'loss': 9.798144340515137, 'step': 22},\n",
       "  {'loss': 9.795609474182129, 'step': 23},\n",
       "  {'loss': 9.794612884521484, 'step': 24},\n",
       "  {'loss': 9.7918062210083, 'step': 25},\n",
       "  {'loss': 9.757583618164062, 'step': 26},\n",
       "  {'loss': 9.775189399719238, 'step': 27},\n",
       "  {'loss': 9.785308837890625, 'step': 28},\n",
       "  {'loss': 9.78015422821045, 'step': 29},\n",
       "  {'loss': 9.74732494354248, 'step': 30},\n",
       "  {'loss': 9.784049034118652, 'step': 31},\n",
       "  {'loss': 9.75192642211914, 'step': 32},\n",
       "  {'loss': 9.761331558227539, 'step': 33},\n",
       "  {'loss': 9.755318641662598, 'step': 34},\n",
       "  {'loss': 9.745278358459473, 'step': 35},\n",
       "  {'loss': 9.759317398071289, 'step': 36},\n",
       "  {'loss': 9.72349739074707, 'step': 37},\n",
       "  {'loss': 9.752588272094727, 'step': 38},\n",
       "  {'loss': 9.687335014343262, 'step': 39},\n",
       "  {'loss': 9.711638450622559, 'step': 40},\n",
       "  {'loss': 9.69842529296875, 'step': 41},\n",
       "  {'loss': 9.717836380004883, 'step': 42},\n",
       "  {'loss': 9.721323013305664, 'step': 43},\n",
       "  {'loss': 9.66833209991455, 'step': 44},\n",
       "  {'loss': 9.706432342529297, 'step': 45},\n",
       "  {'loss': 9.695039749145508, 'step': 46},\n",
       "  {'loss': 9.657621383666992, 'step': 47},\n",
       "  {'loss': 9.694465637207031, 'step': 48},\n",
       "  {'loss': 9.659600257873535, 'step': 49},\n",
       "  {'loss': 9.693618774414062, 'step': 50},\n",
       "  {'loss': 9.685487747192383, 'step': 51},\n",
       "  {'loss': 9.63398265838623, 'step': 52},\n",
       "  {'loss': 9.62395191192627, 'step': 53},\n",
       "  {'loss': 9.646483421325684, 'step': 54},\n",
       "  {'loss': 9.625812530517578, 'step': 55},\n",
       "  {'loss': 9.636113166809082, 'step': 56},\n",
       "  {'loss': 9.641890525817871, 'step': 57},\n",
       "  {'loss': 9.574743270874023, 'step': 58},\n",
       "  {'loss': 9.5806303024292, 'step': 59},\n",
       "  {'loss': 9.551129341125488, 'step': 60},\n",
       "  {'loss': 9.620270729064941, 'step': 61},\n",
       "  {'loss': 9.645980834960938, 'step': 62},\n",
       "  {'loss': 9.552624702453613, 'step': 63},\n",
       "  {'loss': 9.57198715209961, 'step': 64},\n",
       "  {'loss': 9.589040756225586, 'step': 65},\n",
       "  {'loss': 9.551817893981934, 'step': 66},\n",
       "  {'loss': 9.56889533996582, 'step': 67},\n",
       "  {'loss': 9.568305969238281, 'step': 68},\n",
       "  {'loss': 9.479191780090332, 'step': 69},\n",
       "  {'loss': 9.583130836486816, 'step': 70},\n",
       "  {'loss': 9.568540573120117, 'step': 71},\n",
       "  {'loss': 9.598031044006348, 'step': 72},\n",
       "  {'loss': 9.479737281799316, 'step': 73},\n",
       "  {'loss': 9.510876655578613, 'step': 74},\n",
       "  {'loss': 9.507126808166504, 'step': 75},\n",
       "  {'loss': 9.471414566040039, 'step': 76},\n",
       "  {'loss': 9.564030647277832, 'step': 77},\n",
       "  {'loss': 9.471888542175293, 'step': 78},\n",
       "  {'loss': 9.526823043823242, 'step': 79},\n",
       "  {'loss': 9.47747802734375, 'step': 80},\n",
       "  {'loss': 9.41057300567627, 'step': 81},\n",
       "  {'loss': 9.43390941619873, 'step': 82},\n",
       "  {'loss': 9.574742317199707, 'step': 83},\n",
       "  {'loss': 9.480714797973633, 'step': 84},\n",
       "  {'loss': 9.545365333557129, 'step': 85},\n",
       "  {'loss': 9.51284122467041, 'step': 86},\n",
       "  {'loss': 9.371039390563965, 'step': 87},\n",
       "  {'loss': 9.416049003601074, 'step': 88},\n",
       "  {'loss': 9.395752906799316, 'step': 89},\n",
       "  {'loss': 9.404622077941895, 'step': 90},\n",
       "  {'loss': 9.516371726989746, 'step': 91},\n",
       "  {'loss': 9.501144409179688, 'step': 92},\n",
       "  {'loss': 9.38421630859375, 'step': 93},\n",
       "  {'loss': 9.42023754119873, 'step': 94},\n",
       "  {'loss': 9.41605281829834, 'step': 95},\n",
       "  {'loss': 9.424397468566895, 'step': 96},\n",
       "  {'loss': 9.50001049041748, 'step': 97},\n",
       "  {'loss': 9.449893951416016, 'step': 98},\n",
       "  {'loss': 9.340662956237793, 'step': 99},\n",
       "  {'loss': 9.429081916809082, 'step': 100},\n",
       "  {'loss': 9.366186141967773, 'step': 101},\n",
       "  {'loss': 9.30718994140625, 'step': 102},\n",
       "  {'loss': 9.458451271057129, 'step': 103},\n",
       "  {'loss': 9.367474555969238, 'step': 104},\n",
       "  {'loss': 9.2816743850708, 'step': 105},\n",
       "  {'loss': 9.332796096801758, 'step': 106},\n",
       "  {'loss': 9.39151668548584, 'step': 107},\n",
       "  {'loss': 9.373381614685059, 'step': 108},\n",
       "  {'loss': 9.348968505859375, 'step': 109},\n",
       "  {'loss': 9.25849437713623, 'step': 110},\n",
       "  {'loss': 9.348140716552734, 'step': 111},\n",
       "  {'loss': 9.288886070251465, 'step': 112},\n",
       "  {'loss': 9.311527252197266, 'step': 113},\n",
       "  {'loss': 9.288695335388184, 'step': 114},\n",
       "  {'loss': 9.32863712310791, 'step': 115},\n",
       "  {'loss': 9.2759370803833, 'step': 116},\n",
       "  {'loss': 9.364550590515137, 'step': 117},\n",
       "  {'loss': 9.380244255065918, 'step': 118},\n",
       "  {'loss': 9.324796676635742, 'step': 119},\n",
       "  {'loss': 9.328747749328613, 'step': 120},\n",
       "  {'loss': 9.311641693115234, 'step': 121},\n",
       "  {'loss': 9.393279075622559, 'step': 122},\n",
       "  {'loss': 9.342499732971191, 'step': 123},\n",
       "  {'loss': 9.35585880279541, 'step': 124},\n",
       "  {'loss': 9.163926124572754, 'step': 125},\n",
       "  {'loss': 9.358587265014648, 'step': 126},\n",
       "  {'loss': 9.252582550048828, 'step': 127},\n",
       "  {'loss': 9.309552192687988, 'step': 128},\n",
       "  {'loss': 9.108099937438965, 'step': 129},\n",
       "  {'loss': 9.224403381347656, 'step': 130},\n",
       "  {'loss': 9.289463996887207, 'step': 131},\n",
       "  {'loss': 9.248087882995605, 'step': 132},\n",
       "  {'loss': 9.191157341003418, 'step': 133},\n",
       "  {'loss': 9.25373649597168, 'step': 134},\n",
       "  {'loss': 9.351835250854492, 'step': 135},\n",
       "  {'loss': 9.322003364562988, 'step': 136},\n",
       "  {'loss': 9.188521385192871, 'step': 137},\n",
       "  {'loss': 9.265548706054688, 'step': 138},\n",
       "  {'loss': 9.270559310913086, 'step': 139},\n",
       "  {'loss': 9.213106155395508, 'step': 140},\n",
       "  {'loss': 9.14640998840332, 'step': 141},\n",
       "  {'loss': 9.092687606811523, 'step': 142},\n",
       "  {'loss': 9.239729881286621, 'step': 143},\n",
       "  {'loss': 9.15401554107666, 'step': 144},\n",
       "  {'loss': 9.25390911102295, 'step': 145},\n",
       "  {'loss': 9.242325782775879, 'step': 146},\n",
       "  {'loss': 9.159456253051758, 'step': 147},\n",
       "  {'loss': 9.266156196594238, 'step': 148},\n",
       "  {'loss': 9.164239883422852, 'step': 149},\n",
       "  {'loss': 9.20746898651123, 'step': 150},\n",
       "  {'loss': 9.153764724731445, 'step': 151},\n",
       "  {'loss': 9.228300094604492, 'step': 152},\n",
       "  {'loss': 9.08803653717041, 'step': 153},\n",
       "  {'loss': 9.11893081665039, 'step': 154},\n",
       "  {'loss': 9.0639066696167, 'step': 155},\n",
       "  {'loss': 9.155165672302246, 'step': 156},\n",
       "  {'loss': 9.052399635314941, 'step': 157},\n",
       "  {'loss': 9.110669136047363, 'step': 158},\n",
       "  {'loss': 9.088211059570312, 'step': 159},\n",
       "  {'loss': 9.208719253540039, 'step': 160},\n",
       "  {'loss': 9.113317489624023, 'step': 161},\n",
       "  {'loss': 9.039973258972168, 'step': 162},\n",
       "  {'loss': 9.048582077026367, 'step': 163},\n",
       "  {'loss': 9.059297561645508, 'step': 164},\n",
       "  {'loss': 9.079858779907227, 'step': 165},\n",
       "  {'loss': 9.060561180114746, 'step': 166},\n",
       "  {'loss': 9.109713554382324, 'step': 167},\n",
       "  {'loss': 9.067266464233398, 'step': 168},\n",
       "  {'loss': 9.10306453704834, 'step': 169},\n",
       "  {'loss': 9.238569259643555, 'step': 170},\n",
       "  {'loss': 9.088362693786621, 'step': 171},\n",
       "  {'loss': 9.031926155090332, 'step': 172},\n",
       "  {'loss': 9.198432922363281, 'step': 173},\n",
       "  {'loss': 9.172849655151367, 'step': 174},\n",
       "  {'loss': 9.09119701385498, 'step': 175},\n",
       "  {'loss': 8.942459106445312, 'step': 176},\n",
       "  {'loss': 8.939676284790039, 'step': 177},\n",
       "  {'loss': 9.07033634185791, 'step': 178},\n",
       "  {'loss': 9.058637619018555, 'step': 179},\n",
       "  {'loss': 9.156286239624023, 'step': 180},\n",
       "  {'loss': 8.984392166137695, 'step': 181},\n",
       "  {'loss': 8.904107093811035, 'step': 182},\n",
       "  {'loss': 8.999567985534668, 'step': 183},\n",
       "  {'loss': 9.04432201385498, 'step': 184},\n",
       "  {'loss': 9.053499221801758, 'step': 185},\n",
       "  {'loss': 9.218636512756348, 'step': 186},\n",
       "  {'loss': 9.040849685668945, 'step': 187},\n",
       "  {'loss': 8.871851921081543, 'step': 188},\n",
       "  {'loss': 8.975193977355957, 'step': 189},\n",
       "  {'loss': 8.919057846069336, 'step': 190},\n",
       "  {'loss': 9.078103065490723, 'step': 191},\n",
       "  {'loss': 9.084328651428223, 'step': 192},\n",
       "  {'loss': 9.007186889648438, 'step': 193},\n",
       "  {'loss': 8.95875072479248, 'step': 194},\n",
       "  {'loss': 9.094542503356934, 'step': 195},\n",
       "  {'loss': 8.991469383239746, 'step': 196},\n",
       "  {'loss': 9.068235397338867, 'step': 197},\n",
       "  {'loss': 8.972421646118164, 'step': 198},\n",
       "  {'loss': 9.065020561218262, 'step': 199},\n",
       "  {'loss': 8.971847534179688, 'step': 200},\n",
       "  {'loss': 9.029908180236816, 'step': 201},\n",
       "  {'loss': 9.032562255859375, 'step': 202},\n",
       "  {'loss': 8.932425498962402, 'step': 203},\n",
       "  {'loss': 9.034036636352539, 'step': 204},\n",
       "  {'loss': 9.050959587097168, 'step': 205},\n",
       "  {'loss': 9.059194564819336, 'step': 206},\n",
       "  {'loss': 9.023880004882812, 'step': 207},\n",
       "  {'loss': 8.907271385192871, 'step': 208},\n",
       "  {'loss': 8.873651504516602, 'step': 209},\n",
       "  {'loss': 9.007372856140137, 'step': 210},\n",
       "  {'loss': 8.984663963317871, 'step': 211},\n",
       "  {'loss': 9.024389266967773, 'step': 212},\n",
       "  {'loss': 8.915942192077637, 'step': 213},\n",
       "  {'loss': 8.988899230957031, 'step': 214},\n",
       "  {'loss': 8.987166404724121, 'step': 215},\n",
       "  {'loss': 8.892578125, 'step': 216},\n",
       "  {'loss': 8.918411254882812, 'step': 217},\n",
       "  {'loss': 8.970171928405762, 'step': 218},\n",
       "  {'loss': 9.004711151123047, 'step': 219},\n",
       "  {'loss': 8.822643280029297, 'step': 220},\n",
       "  {'loss': 8.878608703613281, 'step': 221},\n",
       "  {'loss': 8.849315643310547, 'step': 222},\n",
       "  {'loss': 8.854726791381836, 'step': 223},\n",
       "  {'loss': 8.778785705566406, 'step': 224},\n",
       "  {'loss': 8.922975540161133, 'step': 225},\n",
       "  {'loss': 8.92293643951416, 'step': 226},\n",
       "  {'loss': 8.996930122375488, 'step': 227},\n",
       "  {'loss': 9.02440071105957, 'step': 228},\n",
       "  {'loss': 9.00390911102295, 'step': 229},\n",
       "  {'loss': 8.87771224975586, 'step': 230},\n",
       "  {'loss': 8.820808410644531, 'step': 231},\n",
       "  {'loss': 8.972745895385742, 'step': 232},\n",
       "  {'loss': 8.904158592224121, 'step': 233},\n",
       "  {'loss': 8.639087677001953, 'step': 234},\n",
       "  {'loss': 9.11594295501709, 'step': 235},\n",
       "  {'loss': 8.821044921875, 'step': 236},\n",
       "  {'loss': 8.90987491607666, 'step': 237},\n",
       "  {'loss': 8.956930160522461, 'step': 238},\n",
       "  {'loss': 8.951848030090332, 'step': 239},\n",
       "  {'loss': 8.94751262664795, 'step': 240},\n",
       "  {'loss': 8.676652908325195, 'step': 241},\n",
       "  {'loss': 8.836201667785645, 'step': 242},\n",
       "  {'loss': 8.859807968139648, 'step': 243},\n",
       "  {'loss': 8.903400421142578, 'step': 244},\n",
       "  {'loss': 8.867164611816406, 'step': 245},\n",
       "  {'loss': 8.84516716003418, 'step': 246},\n",
       "  {'loss': 8.767410278320312, 'step': 247},\n",
       "  {'loss': 8.981059074401855, 'step': 248},\n",
       "  {'loss': 8.741739273071289, 'step': 249},\n",
       "  {'loss': 8.840152740478516, 'step': 250},\n",
       "  {'loss': 8.824912071228027, 'step': 251},\n",
       "  {'loss': 8.710509300231934, 'step': 252},\n",
       "  {'loss': 8.956363677978516, 'step': 253},\n",
       "  {'loss': 8.938477516174316, 'step': 254},\n",
       "  {'loss': 8.75495719909668, 'step': 255},\n",
       "  {'loss': 8.935375213623047, 'step': 256},\n",
       "  {'loss': 8.863585472106934, 'step': 257},\n",
       "  {'loss': 8.88650894165039, 'step': 258},\n",
       "  {'loss': 8.798064231872559, 'step': 259},\n",
       "  {'loss': 8.665128707885742, 'step': 260},\n",
       "  {'loss': 8.715761184692383, 'step': 261},\n",
       "  {'loss': 8.801437377929688, 'step': 262},\n",
       "  {'loss': 8.842313766479492, 'step': 263},\n",
       "  {'loss': 8.664302825927734, 'step': 264},\n",
       "  {'loss': 8.784708023071289, 'step': 265},\n",
       "  {'loss': 8.885903358459473, 'step': 266},\n",
       "  {'loss': 8.641863822937012, 'step': 267},\n",
       "  {'loss': 8.884739875793457, 'step': 268},\n",
       "  {'loss': 8.844690322875977, 'step': 269},\n",
       "  {'loss': 8.905220031738281, 'step': 270},\n",
       "  {'loss': 8.766594886779785, 'step': 271},\n",
       "  {'loss': 8.738362312316895, 'step': 272},\n",
       "  {'loss': 8.787607192993164, 'step': 273},\n",
       "  {'loss': 8.665658950805664, 'step': 274},\n",
       "  {'loss': 8.651803016662598, 'step': 275},\n",
       "  {'loss': 8.612730026245117, 'step': 276},\n",
       "  {'loss': 8.806553840637207, 'step': 277},\n",
       "  {'loss': 8.582005500793457, 'step': 278},\n",
       "  {'loss': 8.85153865814209, 'step': 279},\n",
       "  {'loss': 8.82988452911377, 'step': 280},\n",
       "  {'loss': 8.582549095153809, 'step': 281},\n",
       "  {'loss': 8.776654243469238, 'step': 282},\n",
       "  {'loss': 8.7850980758667, 'step': 283},\n",
       "  {'loss': 8.802377700805664, 'step': 284},\n",
       "  {'loss': 8.752421379089355, 'step': 285},\n",
       "  {'loss': 8.698705673217773, 'step': 286},\n",
       "  {'loss': 8.64425277709961, 'step': 287},\n",
       "  {'loss': 8.796467781066895, 'step': 288},\n",
       "  {'loss': 8.842513084411621, 'step': 289},\n",
       "  {'loss': 8.50121021270752, 'step': 290},\n",
       "  {'loss': 8.894912719726562, 'step': 291},\n",
       "  {'loss': 8.717496871948242, 'step': 292},\n",
       "  {'loss': 8.629034996032715, 'step': 293},\n",
       "  {'loss': 8.565081596374512, 'step': 294},\n",
       "  {'loss': 8.523719787597656, 'step': 295},\n",
       "  {'loss': 8.62295150756836, 'step': 296},\n",
       "  {'loss': 8.616774559020996, 'step': 297},\n",
       "  {'loss': 8.570930480957031, 'step': 298},\n",
       "  {'loss': 8.563624382019043, 'step': 299},\n",
       "  {'loss': 8.66964340209961, 'step': 300},\n",
       "  {'loss': 8.662761688232422, 'step': 301},\n",
       "  {'loss': 8.775044441223145, 'step': 302},\n",
       "  {'loss': 8.601417541503906, 'step': 303},\n",
       "  {'loss': 8.625697135925293, 'step': 304},\n",
       "  {'loss': 8.77127742767334, 'step': 305},\n",
       "  {'loss': 8.605291366577148, 'step': 306},\n",
       "  {'loss': 8.629958152770996, 'step': 307},\n",
       "  {'loss': 8.71025562286377, 'step': 308},\n",
       "  {'loss': 8.763328552246094, 'step': 309},\n",
       "  {'loss': 8.657430648803711, 'step': 310},\n",
       "  {'loss': 8.569184303283691, 'step': 311},\n",
       "  {'loss': 8.621272087097168, 'step': 312},\n",
       "  {'loss': 8.605213165283203, 'step': 313},\n",
       "  {'loss': 8.62685775756836, 'step': 314},\n",
       "  {'loss': 8.588664054870605, 'step': 315},\n",
       "  {'loss': 8.665745735168457, 'step': 316},\n",
       "  {'loss': 8.725031852722168, 'step': 317},\n",
       "  {'loss': 8.71530818939209, 'step': 318},\n",
       "  {'loss': 8.461664199829102, 'step': 319},\n",
       "  {'loss': 8.693548202514648, 'step': 320},\n",
       "  {'loss': 8.691744804382324, 'step': 321},\n",
       "  {'loss': 8.471880912780762, 'step': 322},\n",
       "  {'loss': 8.544949531555176, 'step': 323},\n",
       "  {'loss': 8.529812812805176, 'step': 324},\n",
       "  {'loss': 8.394832611083984, 'step': 325},\n",
       "  {'loss': 8.434576988220215, 'step': 326},\n",
       "  {'loss': 8.766325950622559, 'step': 327},\n",
       "  {'loss': 8.582720756530762, 'step': 328},\n",
       "  {'loss': 8.531678199768066, 'step': 329},\n",
       "  {'loss': 8.4483642578125, 'step': 330},\n",
       "  {'loss': 8.59913444519043, 'step': 331},\n",
       "  {'loss': 8.513890266418457, 'step': 332},\n",
       "  {'loss': 8.505293846130371, 'step': 333},\n",
       "  {'loss': 8.560226440429688, 'step': 334},\n",
       "  {'loss': 8.351287841796875, 'step': 335},\n",
       "  {'loss': 8.419472694396973, 'step': 336},\n",
       "  {'loss': 8.562203407287598, 'step': 337},\n",
       "  {'loss': 8.576593399047852, 'step': 338},\n",
       "  {'loss': 8.491192817687988, 'step': 339},\n",
       "  {'loss': 8.456844329833984, 'step': 340},\n",
       "  {'loss': 8.575774192810059, 'step': 341},\n",
       "  {'loss': 8.620218276977539, 'step': 342},\n",
       "  {'loss': 8.717305183410645, 'step': 343},\n",
       "  {'loss': 8.490206718444824, 'step': 344},\n",
       "  {'loss': 8.65219497680664, 'step': 345},\n",
       "  {'loss': 8.600034713745117, 'step': 346},\n",
       "  {'loss': 8.732148170471191, 'step': 347},\n",
       "  {'loss': 8.29747200012207, 'step': 348},\n",
       "  {'loss': 8.221237182617188, 'step': 349},\n",
       "  {'loss': 8.409331321716309, 'step': 350},\n",
       "  {'loss': 8.538358688354492, 'step': 351},\n",
       "  {'loss': 8.45109748840332, 'step': 352},\n",
       "  {'loss': 8.4774808883667, 'step': 353},\n",
       "  {'loss': 8.64478874206543, 'step': 354},\n",
       "  {'loss': 8.618022918701172, 'step': 355},\n",
       "  {'loss': 8.366127967834473, 'step': 356},\n",
       "  {'loss': 8.412097930908203, 'step': 357},\n",
       "  {'loss': 8.33112621307373, 'step': 358},\n",
       "  {'loss': 8.445385932922363, 'step': 359},\n",
       "  {'loss': 8.53316593170166, 'step': 360},\n",
       "  {'loss': 8.270469665527344, 'step': 361},\n",
       "  {'loss': 8.3283109664917, 'step': 362},\n",
       "  {'loss': 8.232050895690918, 'step': 363},\n",
       "  {'loss': 8.37855052947998, 'step': 364},\n",
       "  {'loss': 8.515766143798828, 'step': 365},\n",
       "  {'loss': 8.341778755187988, 'step': 366},\n",
       "  {'loss': 8.647076606750488, 'step': 367},\n",
       "  {'loss': 8.484308242797852, 'step': 368},\n",
       "  {'loss': 8.405216217041016, 'step': 369},\n",
       "  {'loss': 8.391839981079102, 'step': 370},\n",
       "  {'loss': 8.40927791595459, 'step': 371},\n",
       "  {'loss': 8.564713478088379, 'step': 372},\n",
       "  {'loss': 8.196215629577637, 'step': 373},\n",
       "  {'loss': 8.38123607635498, 'step': 374},\n",
       "  {'loss': 8.506287574768066, 'step': 375},\n",
       "  {'loss': 8.469036102294922, 'step': 376},\n",
       "  {'loss': 8.398704528808594, 'step': 377},\n",
       "  {'loss': 8.55618667602539, 'step': 378},\n",
       "  {'loss': 8.406516075134277, 'step': 379},\n",
       "  {'loss': 8.505419731140137, 'step': 380},\n",
       "  {'loss': 8.30341625213623, 'step': 381},\n",
       "  {'loss': 8.34018611907959, 'step': 382},\n",
       "  {'loss': 8.299081802368164, 'step': 383},\n",
       "  {'loss': 8.208884239196777, 'step': 384},\n",
       "  {'loss': 8.254745483398438, 'step': 385},\n",
       "  {'loss': 8.4708251953125, 'step': 386},\n",
       "  {'loss': 8.153932571411133, 'step': 387},\n",
       "  {'loss': 8.167010307312012, 'step': 388},\n",
       "  {'loss': 8.362157821655273, 'step': 389},\n",
       "  {'loss': 8.227659225463867, 'step': 390},\n",
       "  {'loss': 8.203362464904785, 'step': 391},\n",
       "  {'loss': 8.289861679077148, 'step': 392},\n",
       "  {'loss': 8.286234855651855, 'step': 393},\n",
       "  {'loss': 8.26174259185791, 'step': 394},\n",
       "  {'loss': 8.511531829833984, 'step': 395},\n",
       "  {'loss': 8.44002914428711, 'step': 396},\n",
       "  {'loss': 8.3738431930542, 'step': 397},\n",
       "  {'loss': 8.181098937988281, 'step': 398},\n",
       "  {'loss': 8.488962173461914, 'step': 399},\n",
       "  {'loss': 8.287416458129883, 'step': 400},\n",
       "  {'loss': 8.193572044372559, 'step': 401},\n",
       "  {'loss': 8.379470825195312, 'step': 402},\n",
       "  {'loss': 8.080717086791992, 'step': 403},\n",
       "  {'loss': 8.444629669189453, 'step': 404},\n",
       "  {'loss': 8.11363410949707, 'step': 405},\n",
       "  {'loss': 8.171957015991211, 'step': 406},\n",
       "  {'loss': 8.391733169555664, 'step': 407},\n",
       "  {'loss': 8.046792030334473, 'step': 408},\n",
       "  {'loss': 8.27221393585205, 'step': 409},\n",
       "  {'loss': 8.406961441040039, 'step': 410},\n",
       "  {'loss': 8.138385772705078, 'step': 411},\n",
       "  {'loss': 8.132192611694336, 'step': 412},\n",
       "  {'loss': 8.174872398376465, 'step': 413},\n",
       "  {'loss': 8.082181930541992, 'step': 414},\n",
       "  {'loss': 8.055586814880371, 'step': 415},\n",
       "  {'loss': 8.119308471679688, 'step': 416},\n",
       "  {'loss': 8.479909896850586, 'step': 417},\n",
       "  {'loss': 8.181914329528809, 'step': 418},\n",
       "  {'loss': 8.247441291809082, 'step': 419},\n",
       "  {'loss': 8.220158576965332, 'step': 420},\n",
       "  {'loss': 8.18628215789795, 'step': 421},\n",
       "  {'loss': 8.2152681350708, 'step': 422},\n",
       "  {'loss': 8.044936180114746, 'step': 423},\n",
       "  {'loss': 8.128825187683105, 'step': 424},\n",
       "  {'loss': 8.1235990524292, 'step': 425},\n",
       "  {'loss': 8.07071590423584, 'step': 426},\n",
       "  {'loss': 8.04435920715332, 'step': 427},\n",
       "  {'loss': 8.269603729248047, 'step': 428},\n",
       "  {'loss': 8.173199653625488, 'step': 429},\n",
       "  {'loss': 8.31924819946289, 'step': 430},\n",
       "  {'loss': 8.038536071777344, 'step': 431},\n",
       "  {'loss': 8.300127983093262, 'step': 432},\n",
       "  {'loss': 8.074409484863281, 'step': 433},\n",
       "  {'loss': 8.279748916625977, 'step': 434},\n",
       "  {'loss': 8.126212120056152, 'step': 435},\n",
       "  {'loss': 8.319873809814453, 'step': 436},\n",
       "  {'loss': 7.967853546142578, 'step': 437},\n",
       "  {'loss': 8.132445335388184, 'step': 438},\n",
       "  {'loss': 8.276289939880371, 'step': 439},\n",
       "  {'loss': 8.139466285705566, 'step': 440},\n",
       "  {'loss': 8.119176864624023, 'step': 441},\n",
       "  {'loss': 7.960132122039795, 'step': 442},\n",
       "  {'loss': 8.040223121643066, 'step': 443},\n",
       "  {'loss': 7.964716911315918, 'step': 444},\n",
       "  {'loss': 8.108060836791992, 'step': 445},\n",
       "  {'loss': 8.070221900939941, 'step': 446},\n",
       "  {'loss': 8.10171890258789, 'step': 447},\n",
       "  {'loss': 8.011767387390137, 'step': 448},\n",
       "  {'loss': 8.377668380737305, 'step': 449},\n",
       "  {'loss': 8.196513175964355, 'step': 450},\n",
       "  {'loss': 8.032378196716309, 'step': 451},\n",
       "  {'loss': 7.910572528839111, 'step': 452},\n",
       "  {'loss': 8.143519401550293, 'step': 453},\n",
       "  {'loss': 7.989748477935791, 'step': 454},\n",
       "  {'loss': 7.918307304382324, 'step': 455},\n",
       "  {'loss': 8.245011329650879, 'step': 456},\n",
       "  {'loss': 8.046138763427734, 'step': 457},\n",
       "  {'loss': 7.999521255493164, 'step': 458},\n",
       "  {'loss': 8.16976261138916, 'step': 459},\n",
       "  {'loss': 8.122840881347656, 'step': 460},\n",
       "  {'loss': 8.091448783874512, 'step': 461},\n",
       "  {'loss': 8.197784423828125, 'step': 462},\n",
       "  {'loss': 7.948364734649658, 'step': 463},\n",
       "  {'loss': 7.872488021850586, 'step': 464},\n",
       "  {'loss': 7.983164310455322, 'step': 465},\n",
       "  {'loss': 7.800795555114746, 'step': 466},\n",
       "  {'loss': 7.8938727378845215, 'step': 467},\n",
       "  {'loss': 7.709416389465332, 'step': 468},\n",
       "  {'loss': 7.766854763031006, 'step': 469},\n",
       "  {'loss': 7.9753522872924805, 'step': 470},\n",
       "  {'loss': 8.3013277053833, 'step': 471},\n",
       "  {'loss': 8.004897117614746, 'step': 472},\n",
       "  {'loss': 8.008467674255371, 'step': 473},\n",
       "  {'loss': 7.84035587310791, 'step': 474},\n",
       "  {'loss': 8.255369186401367, 'step': 475},\n",
       "  {'loss': 8.025506019592285, 'step': 476},\n",
       "  {'loss': 7.919884204864502, 'step': 477},\n",
       "  {'loss': 7.983339786529541, 'step': 478},\n",
       "  {'loss': 8.01333999633789, 'step': 479},\n",
       "  {'loss': 7.7160258293151855, 'step': 480},\n",
       "  {'loss': 8.080340385437012, 'step': 481},\n",
       "  {'loss': 7.742181777954102, 'step': 482},\n",
       "  {'loss': 8.100027084350586, 'step': 483},\n",
       "  {'loss': 7.67194938659668, 'step': 484},\n",
       "  {'loss': 7.876597881317139, 'step': 485},\n",
       "  {'loss': 7.644615173339844, 'step': 486},\n",
       "  {'loss': 7.841522216796875, 'step': 487},\n",
       "  {'loss': 7.827939033508301, 'step': 488},\n",
       "  {'loss': 7.65650749206543, 'step': 489},\n",
       "  {'loss': 7.979271411895752, 'step': 490},\n",
       "  {'loss': 7.931693077087402, 'step': 491},\n",
       "  {'loss': 7.887368679046631, 'step': 492},\n",
       "  {'loss': 7.851920127868652, 'step': 493},\n",
       "  {'loss': 7.968984127044678, 'step': 494},\n",
       "  {'loss': 7.600794315338135, 'step': 495},\n",
       "  {'loss': 8.0715970993042, 'step': 496},\n",
       "  {'loss': 7.838352203369141, 'step': 497},\n",
       "  {'loss': 7.77488374710083, 'step': 498},\n",
       "  {'loss': 7.939081192016602, 'step': 499},\n",
       "  {'loss': 8.039007186889648, 'step': 500},\n",
       "  {'loss': 7.662496566772461, 'step': 501},\n",
       "  {'loss': 7.753161430358887, 'step': 502},\n",
       "  {'loss': 7.868305206298828, 'step': 503},\n",
       "  {'loss': 8.092580795288086, 'step': 504},\n",
       "  {'loss': 7.830548286437988, 'step': 505},\n",
       "  {'loss': 8.074541091918945, 'step': 506},\n",
       "  {'loss': 7.952779769897461, 'step': 507},\n",
       "  {'loss': 7.808319568634033, 'step': 508},\n",
       "  {'loss': 7.9101176261901855, 'step': 509},\n",
       "  {'loss': 8.109877586364746, 'step': 510},\n",
       "  {'loss': 7.623711585998535, 'step': 511},\n",
       "  {'loss': 7.53809118270874, 'step': 512},\n",
       "  {'loss': 7.881475448608398, 'step': 513},\n",
       "  {'loss': 7.982760429382324, 'step': 514},\n",
       "  {'loss': 7.67879581451416, 'step': 515},\n",
       "  {'loss': 7.578110218048096, 'step': 516},\n",
       "  {'loss': 7.996891498565674, 'step': 517},\n",
       "  {'loss': 8.060053825378418, 'step': 518},\n",
       "  {'loss': 7.633931636810303, 'step': 519},\n",
       "  {'loss': 7.8979573249816895, 'step': 520},\n",
       "  {'loss': 7.550845623016357, 'step': 521},\n",
       "  {'loss': 7.804014682769775, 'step': 522},\n",
       "  {'loss': 7.943231582641602, 'step': 523},\n",
       "  {'loss': 7.584634780883789, 'step': 524},\n",
       "  {'loss': 7.568360805511475, 'step': 525},\n",
       "  {'loss': 7.681582927703857, 'step': 526},\n",
       "  {'loss': 7.775357246398926, 'step': 527},\n",
       "  {'loss': 7.945344924926758, 'step': 528},\n",
       "  {'loss': 7.736937999725342, 'step': 529},\n",
       "  {'loss': 7.840053081512451, 'step': 530},\n",
       "  {'loss': 7.591031551361084, 'step': 531},\n",
       "  {'loss': 7.579129695892334, 'step': 532},\n",
       "  {'loss': 7.6017022132873535, 'step': 533},\n",
       "  {'loss': 7.6271867752075195, 'step': 534},\n",
       "  {'loss': 7.53063440322876, 'step': 535},\n",
       "  {'loss': 7.752128601074219, 'step': 536},\n",
       "  {'loss': 7.844270706176758, 'step': 537},\n",
       "  {'loss': 7.62183141708374, 'step': 538},\n",
       "  {'loss': 7.7939453125, 'step': 539},\n",
       "  {'loss': 7.612483024597168, 'step': 540},\n",
       "  {'loss': 7.840364933013916, 'step': 541},\n",
       "  {'loss': 7.563924789428711, 'step': 542},\n",
       "  {'loss': 7.618122577667236, 'step': 543},\n",
       "  {'loss': 7.511229038238525, 'step': 544},\n",
       "  {'loss': 7.912269115447998, 'step': 545},\n",
       "  {'loss': 8.098243713378906, 'step': 546},\n",
       "  {'loss': 7.7380194664001465, 'step': 547},\n",
       "  {'loss': 7.720404624938965, 'step': 548},\n",
       "  {'loss': 7.408599853515625, 'step': 549},\n",
       "  {'loss': 7.7318339347839355, 'step': 550},\n",
       "  {'loss': 7.462977886199951, 'step': 551},\n",
       "  {'loss': 7.4393815994262695, 'step': 552},\n",
       "  {'loss': 7.479859352111816, 'step': 553},\n",
       "  {'loss': 7.646608352661133, 'step': 554},\n",
       "  {'loss': 7.825432300567627, 'step': 555},\n",
       "  {'loss': 7.403538703918457, 'step': 556},\n",
       "  {'loss': 7.379714012145996, 'step': 557},\n",
       "  {'loss': 7.700531005859375, 'step': 558},\n",
       "  {'loss': 7.711148738861084, 'step': 559},\n",
       "  {'loss': 7.409149169921875, 'step': 560},\n",
       "  {'loss': 7.362104892730713, 'step': 561},\n",
       "  {'loss': 7.757766246795654, 'step': 562},\n",
       "  {'loss': 7.646092891693115, 'step': 563},\n",
       "  {'loss': 7.312810897827148, 'step': 564},\n",
       "  {'loss': 7.339151859283447, 'step': 565},\n",
       "  {'loss': 7.520821571350098, 'step': 566},\n",
       "  {'loss': 7.572575569152832, 'step': 567},\n",
       "  {'loss': 7.6325154304504395, 'step': 568},\n",
       "  {'loss': 7.41179084777832, 'step': 569},\n",
       "  {'loss': 7.5156097412109375, 'step': 570},\n",
       "  {'loss': 7.4159464836120605, 'step': 571},\n",
       "  {'loss': 7.725754261016846, 'step': 572},\n",
       "  {'loss': 7.762449741363525, 'step': 573},\n",
       "  {'loss': 7.65446138381958, 'step': 574},\n",
       "  {'loss': 7.504302501678467, 'step': 575},\n",
       "  {'loss': 7.4453840255737305, 'step': 576},\n",
       "  {'loss': 7.515389442443848, 'step': 577},\n",
       "  {'loss': 7.319643020629883, 'step': 578},\n",
       "  {'loss': 7.435519218444824, 'step': 579},\n",
       "  {'loss': 7.44362735748291, 'step': 580},\n",
       "  {'loss': 7.509128093719482, 'step': 581},\n",
       "  {'loss': 7.637913227081299, 'step': 582},\n",
       "  {'loss': 7.232608795166016, 'step': 583},\n",
       "  {'loss': 7.404531478881836, 'step': 584},\n",
       "  {'loss': 7.688102722167969, 'step': 585},\n",
       "  {'loss': 7.708151340484619, 'step': 586},\n",
       "  {'loss': 7.679104804992676, 'step': 587},\n",
       "  {'loss': 7.639181613922119, 'step': 588},\n",
       "  {'loss': 7.519156455993652, 'step': 589},\n",
       "  {'loss': 7.5359954833984375, 'step': 590},\n",
       "  {'loss': 7.2540178298950195, 'step': 591},\n",
       "  {'loss': 7.616697788238525, 'step': 592},\n",
       "  {'loss': 7.5237836837768555, 'step': 593},\n",
       "  {'loss': 7.438134670257568, 'step': 594},\n",
       "  {'loss': 7.661373138427734, 'step': 595},\n",
       "  {'loss': 7.493688583374023, 'step': 596},\n",
       "  {'loss': 7.544464111328125, 'step': 597},\n",
       "  {'loss': 7.614814758300781, 'step': 598},\n",
       "  {'loss': 7.359766960144043, 'step': 599},\n",
       "  {'loss': 7.248100280761719, 'step': 600},\n",
       "  {'loss': 7.419273376464844, 'step': 601},\n",
       "  {'loss': 7.192910671234131, 'step': 602},\n",
       "  {'loss': 7.278572082519531, 'step': 603},\n",
       "  {'loss': 7.420602798461914, 'step': 604},\n",
       "  {'loss': 7.541172027587891, 'step': 605},\n",
       "  {'loss': 7.610324859619141, 'step': 606},\n",
       "  {'loss': 7.360537052154541, 'step': 607},\n",
       "  {'loss': 7.052624702453613, 'step': 608},\n",
       "  {'loss': 7.17567777633667, 'step': 609},\n",
       "  {'loss': 7.573752403259277, 'step': 610},\n",
       "  {'loss': 7.467225074768066, 'step': 611},\n",
       "  {'loss': 6.871053695678711, 'step': 612},\n",
       "  {'loss': 6.805602073669434, 'step': 613},\n",
       "  {'loss': 7.20190954208374, 'step': 614},\n",
       "  {'loss': 7.280929088592529, 'step': 615},\n",
       "  {'loss': 7.260803699493408, 'step': 616},\n",
       "  {'loss': 7.5776166915893555, 'step': 617},\n",
       "  {'loss': 7.403669834136963, 'step': 618},\n",
       "  {'loss': 7.380897521972656, 'step': 619},\n",
       "  {'loss': 7.417590618133545, 'step': 620},\n",
       "  {'loss': 7.145906925201416, 'step': 621},\n",
       "  {'loss': 7.430978298187256, 'step': 622},\n",
       "  {'loss': 7.238963603973389, 'step': 623},\n",
       "  {'loss': 7.202678680419922, 'step': 624},\n",
       "  {'loss': 7.263772487640381, 'step': 625},\n",
       "  {'loss': 7.2219014167785645, 'step': 626},\n",
       "  {'loss': 7.502070903778076, 'step': 627},\n",
       "  {'loss': 7.563272953033447, 'step': 628},\n",
       "  {'loss': 7.344910144805908, 'step': 629},\n",
       "  {'loss': 7.236485481262207, 'step': 630},\n",
       "  {'loss': 7.180653095245361, 'step': 631},\n",
       "  {'loss': 7.239179611206055, 'step': 632},\n",
       "  {'loss': 7.165158271789551, 'step': 633},\n",
       "  {'loss': 7.354362487792969, 'step': 634},\n",
       "  {'loss': 7.355130195617676, 'step': 635},\n",
       "  {'loss': 7.13350772857666, 'step': 636},\n",
       "  {'loss': 7.228487491607666, 'step': 637},\n",
       "  {'loss': 7.190441608428955, 'step': 638},\n",
       "  {'loss': 7.316867828369141, 'step': 639},\n",
       "  {'loss': 7.1783294677734375, 'step': 640},\n",
       "  {'loss': 7.376326560974121, 'step': 641},\n",
       "  {'loss': 7.236807346343994, 'step': 642},\n",
       "  {'loss': 7.064455986022949, 'step': 643},\n",
       "  {'loss': 7.088149547576904, 'step': 644},\n",
       "  {'loss': 7.198412895202637, 'step': 645},\n",
       "  {'loss': 7.208761692047119, 'step': 646},\n",
       "  {'loss': 6.746371746063232, 'step': 647},\n",
       "  {'loss': 7.27480411529541, 'step': 648},\n",
       "  {'loss': 7.478042125701904, 'step': 649},\n",
       "  {'loss': 7.259267330169678, 'step': 650},\n",
       "  {'loss': 7.549365520477295, 'step': 651},\n",
       "  {'loss': 7.1027140617370605, 'step': 652},\n",
       "  {'loss': 7.153910160064697, 'step': 653},\n",
       "  {'loss': 7.05064582824707, 'step': 654},\n",
       "  {'loss': 7.0962324142456055, 'step': 655},\n",
       "  {'loss': 7.220417499542236, 'step': 656},\n",
       "  {'loss': 7.353446960449219, 'step': 657},\n",
       "  {'loss': 7.05893611907959, 'step': 658},\n",
       "  {'loss': 7.588277816772461, 'step': 659},\n",
       "  {'loss': 7.038116455078125, 'step': 660},\n",
       "  {'loss': 6.982335090637207, 'step': 661},\n",
       "  {'loss': 6.885031700134277, 'step': 662},\n",
       "  {'loss': 7.063281059265137, 'step': 663},\n",
       "  {'loss': 6.826444625854492, 'step': 664},\n",
       "  {'loss': 7.223424434661865, 'step': 665},\n",
       "  {'loss': 6.924525260925293, 'step': 666},\n",
       "  {'loss': 7.325920581817627, 'step': 667},\n",
       "  {'loss': 6.913729190826416, 'step': 668},\n",
       "  {'loss': 7.005450248718262, 'step': 669},\n",
       "  {'loss': 6.898537635803223, 'step': 670},\n",
       "  {'loss': 7.11794900894165, 'step': 671},\n",
       "  {'loss': 6.8732733726501465, 'step': 672},\n",
       "  {'loss': 7.186951637268066, 'step': 673},\n",
       "  {'loss': 7.000204563140869, 'step': 674},\n",
       "  {'loss': 7.321273326873779, 'step': 675},\n",
       "  {'loss': 7.002373218536377, 'step': 676},\n",
       "  {'loss': 7.040414333343506, 'step': 677},\n",
       "  {'loss': 6.762707710266113, 'step': 678},\n",
       "  {'loss': 7.166513442993164, 'step': 679},\n",
       "  {'loss': 6.959309101104736, 'step': 680},\n",
       "  {'loss': 6.842899799346924, 'step': 681},\n",
       "  {'loss': 6.879718780517578, 'step': 682},\n",
       "  {'loss': 6.825288772583008, 'step': 683},\n",
       "  {'loss': 6.920563220977783, 'step': 684},\n",
       "  {'loss': 7.397566795349121, 'step': 685},\n",
       "  {'loss': 6.765905380249023, 'step': 686},\n",
       "  {'loss': 7.4127020835876465, 'step': 687},\n",
       "  {'loss': 6.83534574508667, 'step': 688},\n",
       "  {'loss': 7.0342183113098145, 'step': 689},\n",
       "  {'loss': 7.2683587074279785, 'step': 690},\n",
       "  {'loss': 6.979836463928223, 'step': 691},\n",
       "  {'loss': 7.186362266540527, 'step': 692},\n",
       "  {'loss': 6.954850196838379, 'step': 693},\n",
       "  {'loss': 6.922297477722168, 'step': 694},\n",
       "  {'loss': 7.103388786315918, 'step': 695},\n",
       "  {'loss': 6.703497886657715, 'step': 696},\n",
       "  {'loss': 7.202080249786377, 'step': 697},\n",
       "  {'loss': 6.977061748504639, 'step': 698},\n",
       "  {'loss': 6.816278457641602, 'step': 699},\n",
       "  {'loss': 6.97164249420166, 'step': 700},\n",
       "  {'loss': 6.6023712158203125, 'step': 701},\n",
       "  {'loss': 6.61500358581543, 'step': 702},\n",
       "  {'loss': 6.782958507537842, 'step': 703},\n",
       "  {'loss': 6.855769157409668, 'step': 704},\n",
       "  {'loss': 7.20353364944458, 'step': 705},\n",
       "  {'loss': 7.1727447509765625, 'step': 706},\n",
       "  {'loss': 6.7514495849609375, 'step': 707},\n",
       "  {'loss': 6.760368824005127, 'step': 708},\n",
       "  {'loss': 6.796632289886475, 'step': 709},\n",
       "  {'loss': 6.769005298614502, 'step': 710},\n",
       "  {'loss': 7.133171081542969, 'step': 711},\n",
       "  {'loss': 6.872676372528076, 'step': 712},\n",
       "  {'loss': 7.074644565582275, 'step': 713},\n",
       "  {'loss': 6.38173246383667, 'step': 714},\n",
       "  {'loss': 6.837430477142334, 'step': 715},\n",
       "  {'loss': 6.472631931304932, 'step': 716},\n",
       "  {'loss': 7.063037395477295, 'step': 717},\n",
       "  {'loss': 6.872349262237549, 'step': 718},\n",
       "  {'loss': 6.792291641235352, 'step': 719},\n",
       "  {'loss': 6.806917190551758, 'step': 720},\n",
       "  {'loss': 6.590226650238037, 'step': 721},\n",
       "  {'loss': 7.0140910148620605, 'step': 722},\n",
       "  {'loss': 7.029476165771484, 'step': 723},\n",
       "  {'loss': 6.881524562835693, 'step': 724},\n",
       "  {'loss': 6.725872039794922, 'step': 725},\n",
       "  {'loss': 7.180850028991699, 'step': 726},\n",
       "  {'loss': 6.859152793884277, 'step': 727},\n",
       "  {'loss': 7.1360039710998535, 'step': 728},\n",
       "  {'loss': 6.8392720222473145, 'step': 729},\n",
       "  {'loss': 6.658226013183594, 'step': 730},\n",
       "  {'loss': 6.427523612976074, 'step': 731},\n",
       "  {'loss': 7.05185079574585, 'step': 732},\n",
       "  {'loss': 6.82747745513916, 'step': 733},\n",
       "  {'loss': 6.384048938751221, 'step': 734},\n",
       "  {'loss': 6.913666248321533, 'step': 735},\n",
       "  {'loss': 7.087681293487549, 'step': 736},\n",
       "  {'loss': 6.6657280921936035, 'step': 737},\n",
       "  {'loss': 6.412182807922363, 'step': 738},\n",
       "  {'loss': 6.44873046875, 'step': 739},\n",
       "  {'loss': 6.3116536140441895, 'step': 740},\n",
       "  {'loss': 6.589488983154297, 'step': 741},\n",
       "  {'loss': 6.947012424468994, 'step': 742},\n",
       "  {'loss': 7.022480487823486, 'step': 743},\n",
       "  {'loss': 6.881643772125244, 'step': 744},\n",
       "  {'loss': 6.492917537689209, 'step': 745},\n",
       "  {'loss': 6.646651744842529, 'step': 746},\n",
       "  {'loss': 6.536855697631836, 'step': 747},\n",
       "  {'loss': 6.790624618530273, 'step': 748},\n",
       "  {'loss': 6.868816375732422, 'step': 749},\n",
       "  {'loss': 7.057665824890137, 'step': 750},\n",
       "  {'loss': 6.957049369812012, 'step': 751},\n",
       "  {'loss': 6.782894611358643, 'step': 752},\n",
       "  {'loss': 6.686537742614746, 'step': 753},\n",
       "  {'loss': 6.550691604614258, 'step': 754},\n",
       "  {'loss': 6.783458232879639, 'step': 755},\n",
       "  {'loss': 6.420059680938721, 'step': 756},\n",
       "  {'loss': 6.9424872398376465, 'step': 757},\n",
       "  {'loss': 6.412377834320068, 'step': 758},\n",
       "  {'loss': 7.0192036628723145, 'step': 759},\n",
       "  {'loss': 6.804492950439453, 'step': 760},\n",
       "  {'loss': 6.594282627105713, 'step': 761},\n",
       "  {'loss': 6.890101432800293, 'step': 762},\n",
       "  {'loss': 6.14341402053833, 'step': 763},\n",
       "  {'loss': 6.409853935241699, 'step': 764},\n",
       "  {'loss': 6.164953708648682, 'step': 765},\n",
       "  {'loss': 6.326357364654541, 'step': 766},\n",
       "  {'loss': 6.245141983032227, 'step': 767},\n",
       "  {'loss': 7.052866458892822, 'step': 768},\n",
       "  {'loss': 6.497331142425537, 'step': 769},\n",
       "  {'loss': 6.4335551261901855, 'step': 770},\n",
       "  {'loss': 6.894372463226318, 'step': 771},\n",
       "  {'loss': 6.426220417022705, 'step': 772},\n",
       "  {'loss': 6.970982074737549, 'step': 773},\n",
       "  {'loss': 6.735883712768555, 'step': 774},\n",
       "  {'loss': 6.596052169799805, 'step': 775},\n",
       "  {'loss': 6.628235340118408, 'step': 776},\n",
       "  {'loss': 6.424242973327637, 'step': 777},\n",
       "  {'loss': 6.7509894371032715, 'step': 778},\n",
       "  {'loss': 6.542701721191406, 'step': 779},\n",
       "  {'loss': 6.474540710449219, 'step': 780},\n",
       "  {'loss': 6.954203128814697, 'step': 781},\n",
       "  {'loss': 6.727956771850586, 'step': 782},\n",
       "  {'loss': 6.604160785675049, 'step': 783},\n",
       "  {'loss': 6.463922500610352, 'step': 784},\n",
       "  {'loss': 6.523988246917725, 'step': 785},\n",
       "  {'loss': 6.672975540161133, 'step': 786},\n",
       "  {'loss': 6.793485641479492, 'step': 787},\n",
       "  {'loss': 6.666577339172363, 'step': 788},\n",
       "  {'loss': 6.483389377593994, 'step': 789},\n",
       "  {'loss': 6.717907905578613, 'step': 790},\n",
       "  {'loss': 6.646519184112549, 'step': 791},\n",
       "  {'loss': 6.441647052764893, 'step': 792},\n",
       "  {'loss': 6.614139080047607, 'step': 793},\n",
       "  {'loss': 6.223081111907959, 'step': 794},\n",
       "  {'loss': 6.280375003814697, 'step': 795},\n",
       "  {'loss': 6.519869327545166, 'step': 796},\n",
       "  {'loss': 6.6783952713012695, 'step': 797},\n",
       "  {'loss': 6.849564552307129, 'step': 798},\n",
       "  {'loss': 6.600376605987549, 'step': 799},\n",
       "  {'loss': 6.588759422302246, 'step': 800},\n",
       "  {'loss': 6.939972400665283, 'step': 801},\n",
       "  {'loss': 6.401448726654053, 'step': 802},\n",
       "  {'loss': 6.559668064117432, 'step': 803},\n",
       "  {'loss': 6.616628170013428, 'step': 804},\n",
       "  {'loss': 6.65771484375, 'step': 805},\n",
       "  {'loss': 6.444131851196289, 'step': 806},\n",
       "  {'loss': 6.7127180099487305, 'step': 807},\n",
       "  {'loss': 6.143030643463135, 'step': 808},\n",
       "  {'loss': 6.079653739929199, 'step': 809},\n",
       "  {'loss': 6.392656326293945, 'step': 810},\n",
       "  {'loss': 6.256018161773682, 'step': 811},\n",
       "  {'loss': 6.4801249504089355, 'step': 812},\n",
       "  {'loss': 6.182559967041016, 'step': 813},\n",
       "  {'loss': 6.354031085968018, 'step': 814},\n",
       "  {'loss': 6.517570495605469, 'step': 815},\n",
       "  {'loss': 6.101158618927002, 'step': 816},\n",
       "  {'loss': 6.459660053253174, 'step': 817},\n",
       "  {'loss': 6.165624618530273, 'step': 818},\n",
       "  {'loss': 6.469085216522217, 'step': 819},\n",
       "  {'loss': 6.354583740234375, 'step': 820},\n",
       "  {'loss': 6.212482929229736, 'step': 821},\n",
       "  {'loss': 6.393891334533691, 'step': 822},\n",
       "  {'loss': 6.352661609649658, 'step': 823},\n",
       "  {'loss': 6.761075496673584, 'step': 824},\n",
       "  {'loss': 6.506620407104492, 'step': 825},\n",
       "  {'loss': 6.412822246551514, 'step': 826},\n",
       "  {'loss': 6.411600112915039, 'step': 827},\n",
       "  {'loss': 6.292466163635254, 'step': 828},\n",
       "  {'loss': 5.990616321563721, 'step': 829},\n",
       "  {'loss': 6.152669429779053, 'step': 830},\n",
       "  {'loss': 6.720433712005615, 'step': 831},\n",
       "  {'loss': 6.43004846572876, 'step': 832},\n",
       "  {'loss': 6.147738933563232, 'step': 833},\n",
       "  {'loss': 6.521489143371582, 'step': 834},\n",
       "  {'loss': 6.4380879402160645, 'step': 835},\n",
       "  {'loss': 6.157381057739258, 'step': 836},\n",
       "  {'loss': 6.310478687286377, 'step': 837},\n",
       "  {'loss': 6.377335071563721, 'step': 838},\n",
       "  {'loss': 5.8633599281311035, 'step': 839},\n",
       "  {'loss': 6.260729789733887, 'step': 840},\n",
       "  {'loss': 6.669661998748779, 'step': 841},\n",
       "  {'loss': 5.936858177185059, 'step': 842},\n",
       "  {'loss': 6.5220770835876465, 'step': 843},\n",
       "  {'loss': 6.698035717010498, 'step': 844},\n",
       "  {'loss': 6.533591270446777, 'step': 845},\n",
       "  {'loss': 6.407759189605713, 'step': 846},\n",
       "  {'loss': 6.965987205505371, 'step': 847},\n",
       "  {'loss': 6.400049209594727, 'step': 848},\n",
       "  {'loss': 6.1022562980651855, 'step': 849},\n",
       "  {'loss': 6.46763801574707, 'step': 850},\n",
       "  {'loss': 6.218712329864502, 'step': 851},\n",
       "  {'loss': 6.487594127655029, 'step': 852},\n",
       "  {'loss': 6.779996871948242, 'step': 853},\n",
       "  {'loss': 5.898647308349609, 'step': 854},\n",
       "  {'loss': 6.378260612487793, 'step': 855},\n",
       "  {'loss': 6.212375164031982, 'step': 856},\n",
       "  {'loss': 6.208811283111572, 'step': 857},\n",
       "  {'loss': 6.041423320770264, 'step': 858},\n",
       "  {'loss': 6.626545429229736, 'step': 859},\n",
       "  {'loss': 6.185690402984619, 'step': 860},\n",
       "  {'loss': 6.442896842956543, 'step': 861},\n",
       "  {'loss': 5.880921363830566, 'step': 862},\n",
       "  {'loss': 6.13297176361084, 'step': 863},\n",
       "  {'loss': 6.622337818145752, 'step': 864},\n",
       "  {'loss': 6.253628253936768, 'step': 865},\n",
       "  {'loss': 6.032254695892334, 'step': 866},\n",
       "  {'loss': 6.134289741516113, 'step': 867},\n",
       "  {'loss': 6.359626770019531, 'step': 868},\n",
       "  {'loss': 6.12841272354126, 'step': 869},\n",
       "  {'loss': 6.2243571281433105, 'step': 870},\n",
       "  {'loss': 6.647194862365723, 'step': 871},\n",
       "  {'loss': 6.217919826507568, 'step': 872},\n",
       "  {'loss': 6.533576965332031, 'step': 873},\n",
       "  {'loss': 5.878921031951904, 'step': 874},\n",
       "  {'loss': 6.064448356628418, 'step': 875},\n",
       "  {'loss': 6.3332648277282715, 'step': 876},\n",
       "  {'loss': 6.441946029663086, 'step': 877},\n",
       "  {'loss': 6.615365982055664, 'step': 878},\n",
       "  {'loss': 5.89378023147583, 'step': 879},\n",
       "  {'loss': 6.545399188995361, 'step': 880},\n",
       "  {'loss': 6.4652862548828125, 'step': 881},\n",
       "  {'loss': 5.946929931640625, 'step': 882},\n",
       "  {'loss': 5.856050968170166, 'step': 883},\n",
       "  {'loss': 5.924630641937256, 'step': 884},\n",
       "  {'loss': 5.97351598739624, 'step': 885},\n",
       "  {'loss': 6.422805309295654, 'step': 886},\n",
       "  {'loss': 5.645358562469482, 'step': 887},\n",
       "  {'loss': 6.643848896026611, 'step': 888},\n",
       "  {'loss': 6.315036296844482, 'step': 889},\n",
       "  {'loss': 5.754064083099365, 'step': 890},\n",
       "  {'loss': 6.428535461425781, 'step': 891},\n",
       "  {'loss': 6.031391143798828, 'step': 892},\n",
       "  {'loss': 6.575178623199463, 'step': 893},\n",
       "  {'loss': 5.68794584274292, 'step': 894},\n",
       "  {'loss': 5.887879371643066, 'step': 895},\n",
       "  {'loss': 6.439488887786865, 'step': 896},\n",
       "  {'loss': 6.060807704925537, 'step': 897},\n",
       "  {'loss': 6.241331100463867, 'step': 898},\n",
       "  {'loss': 5.856804370880127, 'step': 899},\n",
       "  {'loss': 6.2326884269714355, 'step': 900},\n",
       "  {'loss': 6.350996971130371, 'step': 901},\n",
       "  {'loss': 6.129929542541504, 'step': 902},\n",
       "  {'loss': 6.12077522277832, 'step': 903},\n",
       "  {'loss': 6.366667747497559, 'step': 904},\n",
       "  {'loss': 6.114618301391602, 'step': 905},\n",
       "  {'loss': 5.841954708099365, 'step': 906},\n",
       "  {'loss': 6.1002349853515625, 'step': 907},\n",
       "  {'loss': 6.0003790855407715, 'step': 908},\n",
       "  {'loss': 6.302381992340088, 'step': 909},\n",
       "  {'loss': 5.930723190307617, 'step': 910},\n",
       "  {'loss': 6.792819023132324, 'step': 911},\n",
       "  {'loss': 6.050777435302734, 'step': 912},\n",
       "  {'loss': 6.03435754776001, 'step': 913},\n",
       "  {'loss': 6.432835102081299, 'step': 914},\n",
       "  {'loss': 6.408613681793213, 'step': 915},\n",
       "  {'loss': 6.157520771026611, 'step': 916},\n",
       "  {'loss': 5.919694423675537, 'step': 917},\n",
       "  {'loss': 6.100661754608154, 'step': 918},\n",
       "  {'loss': 6.163241863250732, 'step': 919},\n",
       "  {'loss': 6.095033645629883, 'step': 920},\n",
       "  {'loss': 6.04942512512207, 'step': 921},\n",
       "  {'loss': 6.6344475746154785, 'step': 922},\n",
       "  {'loss': 6.220879554748535, 'step': 923},\n",
       "  {'loss': 6.06471586227417, 'step': 924},\n",
       "  {'loss': 6.50090217590332, 'step': 925},\n",
       "  {'loss': 6.234198570251465, 'step': 926},\n",
       "  {'loss': 5.856634140014648, 'step': 927},\n",
       "  {'loss': 6.285114288330078, 'step': 928},\n",
       "  {'loss': 5.751072883605957, 'step': 929},\n",
       "  {'loss': 5.739396572113037, 'step': 930},\n",
       "  {'loss': 6.528622150421143, 'step': 931},\n",
       "  {'loss': 6.39697265625, 'step': 932},\n",
       "  {'loss': 5.820724010467529, 'step': 933},\n",
       "  {'loss': 6.252703666687012, 'step': 934},\n",
       "  {'loss': 6.247100830078125, 'step': 935},\n",
       "  {'loss': 6.10801362991333, 'step': 936},\n",
       "  {'loss': 6.209494590759277, 'step': 937},\n",
       "  {'loss': 6.211244106292725, 'step': 938},\n",
       "  {'loss': 6.35581111907959, 'step': 939},\n",
       "  {'loss': 6.103100776672363, 'step': 940},\n",
       "  {'loss': 6.355157852172852, 'step': 941},\n",
       "  {'loss': 5.793361663818359, 'step': 942},\n",
       "  {'loss': 6.325167655944824, 'step': 943},\n",
       "  {'loss': 5.846010208129883, 'step': 944},\n",
       "  {'loss': 6.32049560546875, 'step': 945},\n",
       "  {'loss': 5.615293502807617, 'step': 946},\n",
       "  {'loss': 6.3342485427856445, 'step': 947},\n",
       "  {'loss': 5.682007789611816, 'step': 948},\n",
       "  {'loss': 6.319393157958984, 'step': 949},\n",
       "  {'loss': 5.672182083129883, 'step': 950},\n",
       "  {'loss': 6.025759696960449, 'step': 951},\n",
       "  {'loss': 5.863156318664551, 'step': 952},\n",
       "  {'loss': 5.91831111907959, 'step': 953},\n",
       "  {'loss': 5.561910152435303, 'step': 954},\n",
       "  {'loss': 6.213804244995117, 'step': 955},\n",
       "  {'loss': 6.08738374710083, 'step': 956},\n",
       "  {'loss': 6.731727600097656, 'step': 957},\n",
       "  {'loss': 6.566563129425049, 'step': 958},\n",
       "  {'loss': 6.195073127746582, 'step': 959},\n",
       "  {'loss': 5.968361854553223, 'step': 960},\n",
       "  {'loss': 6.269258499145508, 'step': 961},\n",
       "  {'loss': 5.994617938995361, 'step': 962},\n",
       "  {'loss': 5.974306106567383, 'step': 963},\n",
       "  {'loss': 5.864329814910889, 'step': 964},\n",
       "  {'loss': 6.0897111892700195, 'step': 965},\n",
       "  {'loss': 5.715709686279297, 'step': 966},\n",
       "  {'loss': 6.240804672241211, 'step': 967},\n",
       "  {'loss': 5.922457218170166, 'step': 968},\n",
       "  {'loss': 6.1063714027404785, 'step': 969},\n",
       "  {'loss': 6.401360988616943, 'step': 970},\n",
       "  {'loss': 6.3525896072387695, 'step': 971},\n",
       "  {'loss': 5.7145891189575195, 'step': 972},\n",
       "  {'loss': 6.37337064743042, 'step': 973},\n",
       "  {'loss': 6.41904354095459, 'step': 974},\n",
       "  {'loss': 6.272130012512207, 'step': 975},\n",
       "  {'loss': 5.771330833435059, 'step': 976},\n",
       "  {'loss': 5.871979713439941, 'step': 977},\n",
       "  {'loss': 6.004667282104492, 'step': 978},\n",
       "  {'loss': 5.916846752166748, 'step': 979},\n",
       "  {'loss': 5.778467178344727, 'step': 980},\n",
       "  {'loss': 6.013788223266602, 'step': 981},\n",
       "  {'loss': 5.96095085144043, 'step': 982},\n",
       "  {'loss': 5.790797233581543, 'step': 983},\n",
       "  {'loss': 6.133179187774658, 'step': 984},\n",
       "  {'loss': 5.603740215301514, 'step': 985},\n",
       "  {'loss': 6.181164741516113, 'step': 986},\n",
       "  {'loss': 6.366533279418945, 'step': 987},\n",
       "  {'loss': 5.507779598236084, 'step': 988},\n",
       "  {'loss': 6.176495552062988, 'step': 989},\n",
       "  {'loss': 5.547143459320068, 'step': 990},\n",
       "  {'loss': 5.528655529022217, 'step': 991},\n",
       "  {'loss': 6.072533130645752, 'step': 992},\n",
       "  {'loss': 6.125202655792236, 'step': 993},\n",
       "  {'loss': 6.170735836029053, 'step': 994},\n",
       "  {'loss': 6.270724296569824, 'step': 995},\n",
       "  {'loss': 5.52661657333374, 'step': 996},\n",
       "  {'loss': 5.807320594787598, 'step': 997},\n",
       "  {'loss': 5.93898868560791, 'step': 998},\n",
       "  {'loss': 6.079708576202393, 'step': 999},\n",
       "  {'loss': 6.066611289978027, 'step': 1000},\n",
       "  ...],\n",
       " 'val': [{'loss': 7.80135418176651, 'step': 500},\n",
       "  {'loss': 5.98285802602768, 'step': 1000},\n",
       "  {'loss': 5.58288711309433, 'step': 1500},\n",
       "  {'loss': 5.267024636268616, 'step': 2000},\n",
       "  {'loss': 5.016985201835633, 'step': 2500},\n",
       "  {'loss': 4.860579144954682, 'step': 3000},\n",
       "  {'loss': 4.720958852767945, 'step': 3500},\n",
       "  {'loss': 4.5678460717201235, 'step': 4000},\n",
       "  {'loss': 4.4477430284023285, 'step': 4500},\n",
       "  {'loss': 4.341712653636932, 'step': 5000},\n",
       "  {'loss': 4.268058353662491, 'step': 5500},\n",
       "  {'loss': 4.185980528593063, 'step': 6000},\n",
       "  {'loss': 4.130827158689499, 'step': 6500},\n",
       "  {'loss': 4.10299768447876, 'step': 7000},\n",
       "  {'loss': 4.0408204853534695, 'step': 7500},\n",
       "  {'loss': 4.003622460365295, 'step': 8000},\n",
       "  {'loss': 3.975850224494934, 'step': 8500},\n",
       "  {'loss': 3.9199198961257933, 'step': 9000},\n",
       "  {'loss': 3.8767536282539368, 'step': 9500},\n",
       "  {'loss': 3.852266973257065, 'step': 10000},\n",
       "  {'loss': 3.826614487171173, 'step': 10500},\n",
       "  {'loss': 3.7956343710422518, 'step': 11000},\n",
       "  {'loss': 3.76526198387146, 'step': 11500},\n",
       "  {'loss': 3.7526478588581087, 'step': 12000},\n",
       "  {'loss': 3.7306397795677184, 'step': 12500},\n",
       "  {'loss': 3.704298198223114, 'step': 13000},\n",
       "  {'loss': 3.6761026084423065, 'step': 13500},\n",
       "  {'loss': 3.6724531590938567, 'step': 14000},\n",
       "  {'loss': 3.654512971639633, 'step': 14500},\n",
       "  {'loss': 3.6387961983680723, 'step': 15000},\n",
       "  {'loss': 3.6119379103183746, 'step': 15500},\n",
       "  {'loss': 3.608847600221634, 'step': 16000},\n",
       "  {'loss': 3.5992924153804777, 'step': 16500},\n",
       "  {'loss': 3.585406643152237, 'step': 17000},\n",
       "  {'loss': 3.577836441993713, 'step': 17500},\n",
       "  {'loss': 3.571354418992996, 'step': 18000},\n",
       "  {'loss': 3.5578455507755278, 'step': 18500},\n",
       "  {'loss': 3.5549595236778258, 'step': 19000},\n",
       "  {'loss': 3.538725870847702, 'step': 19500},\n",
       "  {'loss': 3.535447561740875, 'step': 20000},\n",
       "  {'loss': 3.519705408811569, 'step': 20500},\n",
       "  {'loss': 3.519858664274216, 'step': 21000},\n",
       "  {'loss': 3.514334815740585, 'step': 21500},\n",
       "  {'loss': 3.5133315443992617, 'step': 22000},\n",
       "  {'loss': 3.5037882804870604, 'step': 22500},\n",
       "  {'loss': 3.4987852036952973, 'step': 23000},\n",
       "  {'loss': 3.504522478580475, 'step': 23500},\n",
       "  {'loss': 3.4853438317775725, 'step': 24000},\n",
       "  {'loss': 3.479159390926361, 'step': 24500},\n",
       "  {'loss': 3.4784249305725097, 'step': 25000},\n",
       "  {'loss': 3.473063349723816, 'step': 25500},\n",
       "  {'loss': 3.466791969537735, 'step': 26000},\n",
       "  {'loss': 3.4815614461898803, 'step': 26500},\n",
       "  {'loss': 3.460181492567062, 'step': 27000},\n",
       "  {'loss': 3.4704142928123476, 'step': 27500},\n",
       "  {'loss': 3.4553577184677122, 'step': 28000},\n",
       "  {'loss': 3.4623599529266356, 'step': 28500},\n",
       "  {'loss': 3.4595616817474366, 'step': 29000},\n",
       "  {'loss': 3.4506090462207792, 'step': 29500},\n",
       "  {'loss': 3.449717456102371, 'step': 30000},\n",
       "  {'loss': 3.4482212245464323, 'step': 30500},\n",
       "  {'loss': 3.428811329603195, 'step': 31000},\n",
       "  {'loss': 3.4423444271087646, 'step': 31500},\n",
       "  {'loss': 3.4447088956832888, 'step': 32000},\n",
       "  {'loss': 3.4444687247276304, 'step': 32500},\n",
       "  {'loss': 3.439121586084366, 'step': 33000},\n",
       "  {'loss': 3.4357841551303863, 'step': 33500},\n",
       "  {'loss': 3.433700865507126, 'step': 34000},\n",
       "  {'loss': 3.4397115230560305, 'step': 34500},\n",
       "  {'loss': 3.4385421335697175, 'step': 35000},\n",
       "  {'loss': 3.4309907078742983, 'step': 35500},\n",
       "  {'loss': 3.4457204341888428, 'step': 36000}]}"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "record"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "rTjbeFlIN4yZ"
   },
   "source": [
    "## 推理\n",
    "\n",
    "- 翻译项目的评估指标一般是BLEU4，感兴趣的同学自行了解并实现\n",
    "- 接下来进行翻译推理，并作出注意力的热度图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:49:48.725307Z",
     "iopub.status.busy": "2025-02-07T13:49:48.724943Z",
     "iopub.status.idle": "2025-02-07T13:50:05.544409Z",
     "shell.execute_reply": "2025-02-07T13:50:05.543776Z",
     "shell.execute_reply.started": "2025-02-07T13:49:48.725284Z"
    },
    "id": "WxsjkyQgN4yZ",
    "outputId": "5ce160c2-ce7e-4bc3-d2b6-a332c7fcf6a1",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Looking in indexes: https://mirrors.cloud.aliyuncs.com/pypi/simple\n",
      "Collecting Cython\n",
      "  Downloading https://mirrors.cloud.aliyuncs.com/pypi/packages/f0/89/b1ae45689abecca777f95462781a76e67ff46b55495a481ec5a73a739994/Cython-3.0.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.6 MB)\n",
      "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.6/3.6 MB\u001b[0m \u001b[31m92.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m:00:01\u001b[0m\n",
      "\u001b[?25hInstalling collected packages: Cython\n",
      "Successfully installed Cython-3.0.11\n",
      "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n",
      "\u001b[0m\n",
      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.3.2\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.0\u001b[0m\n",
      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n",
      "Looking in indexes: https://mirrors.cloud.aliyuncs.com/pypi/simple\n",
      "Collecting fastBPE\n",
      "  Downloading https://mirrors.cloud.aliyuncs.com/pypi/packages/e1/37/f97181428a5d151501b90b2cebedf97c81b034ace753606a3cda5ad4e6e2/fastBPE-0.1.0.tar.gz (35 kB)\n",
      "  Preparing metadata (setup.py) ... \u001b[?25ldone\n",
      "\u001b[?25hBuilding wheels for collected packages: fastBPE\n",
      "  Building wheel for fastBPE (setup.py) ... \u001b[?25ldone\n",
      "\u001b[?25h  Created wheel for fastBPE: filename=fastBPE-0.1.0-cp310-cp310-linux_x86_64.whl size=807197 sha256=1b44dbc2951b5d5a06cbc2d5d3f55b4539c17c2cb7678733d5f01944307dd7bb\n",
      "  Stored in directory: /root/.cache/pip/wheels/1d/0e/8b/95330f4ce22158266a1989a849aa21eb10e679bbc4f54b743b\n",
      "Successfully built fastBPE\n",
      "Installing collected packages: fastBPE\n",
      "Successfully installed fastBPE-0.1.0\n",
      "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n",
      "\u001b[0m\n",
      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.3.2\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.0\u001b[0m\n",
      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n"
     ]
    }
   ],
   "source": [
    "!pip install Cython  # if failed to install fastBPE, try this line\n",
    "!pip install fastBPE #分词使用\n",
    "# 在 Windows 系统上并没有 sys/mman.h 文件"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 35
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:50:28.450861Z",
     "iopub.status.busy": "2025-02-07T13:50:28.450468Z",
     "iopub.status.idle": "2025-02-07T13:50:28.455181Z",
     "shell.execute_reply": "2025-02-07T13:50:28.454611Z",
     "shell.execute_reply.started": "2025-02-07T13:50:28.450834Z"
    },
    "id": "f6Ry1PcAn4k1",
    "outputId": "6393524e-e5c3-4f93-dd9d-f249ca52bc05",
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'translate-transformer-not-share'"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "exp_name"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:50:30.875360Z",
     "iopub.status.busy": "2025-02-07T13:50:30.874994Z",
     "iopub.status.idle": "2025-02-07T13:50:31.004433Z",
     "shell.execute_reply": "2025-02-07T13:50:31.003840Z",
     "shell.execute_reply.started": "2025-02-07T13:50:30.875337Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "总计 281556\n",
      "-rw-r--r-- 1 root root 288311620  2月  7 21:43 best.ckpt\n"
     ]
    }
   ],
   "source": [
    "!ls checkpoints/translate-transformer-not-share -l"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T03:10:32.326542400Z",
     "start_time": "2024-08-05T03:10:31.006376300Z"
    },
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:50:34.560098Z",
     "iopub.status.busy": "2025-02-07T13:50:34.559696Z",
     "iopub.status.idle": "2025-02-07T13:50:34.716319Z",
     "shell.execute_reply": "2025-02-07T13:50:34.715698Z",
     "shell.execute_reply.started": "2025-02-07T13:50:34.560062Z"
    },
    "id": "jT1Mqiq3N4yZ",
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_1506/44154657.py:3: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature.\n",
      "  state_dict = torch.load(f\"checkpoints/translate-transformer-not-share/best.ckpt\", map_location=device)\n"
     ]
    }
   ],
   "source": [
    "import torch\n",
    "\n",
    "state_dict = torch.load(f\"checkpoints/translate-transformer-not-share/best.ckpt\", map_location=device)\n",
    "\n",
    "# state_dict1 = torch.load(\"epoch125-step132426.ckpt\", map_location=\"cpu\")\n",
    "# state_dict = state_dict1[\"state_dict\"]\n",
    "\n",
    "# update keys by dropping `model`\n",
    "# for key in list(state_dict):\n",
    "#     state_dict[key.replace(\"model.\", \"\")] = state_dict.pop(key)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T03:10:46.720508800Z",
     "start_time": "2024-08-05T03:10:36.179313900Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:50:40.480279Z",
     "iopub.status.busy": "2025-02-07T13:50:40.479792Z",
     "iopub.status.idle": "2025-02-07T13:50:45.011154Z",
     "shell.execute_reply": "2025-02-07T13:50:45.010479Z",
     "shell.execute_reply.started": "2025-02-07T13:50:40.480256Z"
    },
    "id": "eKwIDdjgvTlO",
    "outputId": "35979ff2-a16d-4aa4-881a-8496e39e2469",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Looking in indexes: https://mirrors.cloud.aliyuncs.com/pypi/simple\n",
      "Requirement already satisfied: nltk in /usr/local/lib/python3.10/site-packages (3.9.1)\n",
      "Requirement already satisfied: click in /usr/local/lib/python3.10/site-packages (from nltk) (8.1.8)\n",
      "Requirement already satisfied: joblib in /usr/local/lib/python3.10/site-packages (from nltk) (1.4.2)\n",
      "Requirement already satisfied: regex>=2021.8.3 in /usr/local/lib/python3.10/site-packages (from nltk) (2024.11.6)\n",
      "Requirement already satisfied: tqdm in /usr/local/lib/python3.10/site-packages (from nltk) (4.67.1)\n",
      "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n",
      "\u001b[0m\n",
      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.3.2\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.0\u001b[0m\n",
      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n"
     ]
    }
   ],
   "source": [
    "!pip install nltk"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-07T13:50:52.126034Z",
     "iopub.status.busy": "2025-02-07T13:50:52.125639Z",
     "iopub.status.idle": "2025-02-07T13:50:52.257782Z",
     "shell.execute_reply": "2025-02-07T13:50:52.257138Z",
     "shell.execute_reply.started": "2025-02-07T13:50:52.126008Z"
    },
    "id": "WVksjIhL_pt9",
    "tags": []
   },
   "outputs": [],
   "source": [
    "!rm -r wmt16/.cache"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:50:53.399799Z",
     "iopub.status.busy": "2025-02-07T13:50:53.399434Z",
     "iopub.status.idle": "2025-02-07T13:50:53.404665Z",
     "shell.execute_reply": "2025-02-07T13:50:53.404075Z",
     "shell.execute_reply.started": "2025-02-07T13:50:53.399775Z"
    },
    "id": "2MY69-6WWSjp",
    "outputId": "911d9066-7917-4917-b5cc-d679a1c63865",
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['ein der in im essen um leitungen vor brauner .']"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tokenizer.decode([[   5,   16,    6,   23,  150,   80, 8248,   35,  232,    4,    3]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 101,
     "referenced_widgets": [
      "c9db4cd83b7b4f53a0fa93b8c365debd",
      "a972aba7913b48c6973ae27bff5b9d1d",
      "22aa774ab39e4fd78b0ff08d430d2b5d",
      "9a01f02fb99b4b81ac487d23bc5daf4a",
      "19f846338f6b48c9930b58575641e5b8",
      "7d293204dc1b4d97bb5ee670787c7b7d",
      "ea8fa440f320435aa75c9bef75bc3f08",
      "4e64bcb87e584beda0408a0aa5a659ae",
      "b077d7562d814df5b6d839464dd4122f",
      "5a28babf4e2e4393bdc1a093034885ab",
      "be07d518c21149d196c610fd57b1eaec"
     ]
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:50:58.040604Z",
     "iopub.status.busy": "2025-02-07T13:50:58.040253Z",
     "iopub.status.idle": "2025-02-07T13:51:09.424839Z",
     "shell.execute_reply": "2025-02-07T13:51:09.424356Z",
     "shell.execute_reply.started": "2025-02-07T13:50:58.040581Z"
    },
    "id": "5QgodlOJfgKj",
    "outputId": "2907bad2-7cb1-4295-c8b0-77ac0dabf398",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "save cache to wmt16/.cache/de2en_test_128.npy\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "0it [00:00, ?it/s]/usr/local/lib/python3.10/site-packages/nltk/translate/bleu_score.py:577: UserWarning: \n",
      "The hypothesis contains 0 counts of 4-gram overlaps.\n",
      "Therefore the BLEU score evaluates to 0, independently of\n",
      "how many N-gram overlaps of lower order it contains.\n",
      "Consider using lower n-gram order or use SmoothingFunction()\n",
      "  warnings.warn(_msg)\n",
      "8it [00:00, 76.32it/s]/usr/local/lib/python3.10/site-packages/nltk/translate/bleu_score.py:577: UserWarning: \n",
      "The hypothesis contains 0 counts of 3-gram overlaps.\n",
      "Therefore the BLEU score evaluates to 0, independently of\n",
      "how many N-gram overlaps of lower order it contains.\n",
      "Consider using lower n-gram order or use SmoothingFunction()\n",
      "  warnings.warn(_msg)\n",
      "19it [00:00, 90.97it/s]/usr/local/lib/python3.10/site-packages/nltk/translate/bleu_score.py:577: UserWarning: \n",
      "The hypothesis contains 0 counts of 2-gram overlaps.\n",
      "Therefore the BLEU score evaluates to 0, independently of\n",
      "how many N-gram overlaps of lower order it contains.\n",
      "Consider using lower n-gram order or use SmoothingFunction()\n",
      "  warnings.warn(_msg)\n",
      "967it [00:09, 101.16it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "testing loss: 3.3122867059806262\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.5907859164464453"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from nltk.translate.bleu_score import sentence_bleu\n",
    "# load checkpoints\n",
    "model = TransformerModel(config)\n",
    "model.load_state_dict(state_dict)\n",
    "\n",
    "loss_fct = CrossEntropyWithPadding(config)\n",
    "# from dataset import LangPairDataset\n",
    "test_ds = LangPairDataset(\"test\", max_length=128, data_dir=\"./wmt16\")\n",
    "test_dl = DataLoader(test_ds, batch_size=1, collate_fn=partial(collate_fct, tokenizer=tokenizer))\n",
    "\n",
    "model = model.to(device)\n",
    "model.eval()\n",
    "collect = {}\n",
    "loss_collect = []\n",
    "\n",
    "predictions = []\n",
    "answers = []\n",
    "# 初始化BLEU分数列表\n",
    "bleu_scores = []\n",
    "for idx, batch in tqdm(enumerate(test_dl)):\n",
    "    encoder_inputs = batch[\"encoder_inputs\"]\n",
    "    encoder_inputs_mask = batch[\"encoder_inputs_mask\"]\n",
    "    decoder_inputs = batch[\"decoder_inputs\"]\n",
    "    decoder_labels = batch[\"decoder_labels\"]\n",
    "    # print(decoder_labels.cpu())\n",
    "    # decoder_labels1=tokenizer.decode(decoder_labels.cpu().numpy())\n",
    "    # print(decoder_labels1)\n",
    "    # 前向计算\n",
    "    outputs = model(\n",
    "        encoder_inputs=encoder_inputs,\n",
    "        decoder_inputs=decoder_inputs,\n",
    "        encoder_inputs_mask=encoder_inputs_mask\n",
    "        )\n",
    "    loss = loss_fct(outputs.logits, decoder_labels)         # 验证集损失\n",
    "\n",
    "    # print(outputs.logits.shape, decoder_labels.shape)\n",
    "\n",
    "    # loss = loss_fct(outputs.logits[:, :decoder_labels.shape[1]], decoder_labels)         # 验证集损失\n",
    "    # outputs = model.infer(encoder_inputs=encoder_inputs)\n",
    "    # print(outputs.logits.shape)\n",
    "    preds = outputs.logits.argmax(dim=-1) # 预测结果，[1,seq_len]\n",
    "    # print(preds.shape)\n",
    "    #把preds转为英文单词\n",
    "    preds = tokenizer.decode(preds.cpu().numpy()) #['预测句子']\n",
    "    # predictions.append(preds)\n",
    "    # print(preds)\n",
    "    #把decoder_labels转为英文单词\n",
    "    decoder_labels = tokenizer.decode(decoder_labels.cpu().numpy()) #['标签句子']\n",
    "    # answers.append(decoder_labels)\n",
    "    # print(decoder_labels)\n",
    "    belu=sentence_bleu([decoder_labels[0].split()],preds[0].split(),weights=(1, 0, 0, 0))\n",
    "    bleu_scores.append(belu)\n",
    "    collect[idx] = {\"loss\": loss.item(), \"src_inputs\": encoder_inputs, \"trg_inputs\": decoder_inputs, \"mask\": encoder_inputs_mask, \"trg_labels\": decoder_labels, \"preds\": preds}\n",
    "    loss_collect.append(loss.item())\n",
    "    # break\n",
    "\n",
    "# sort collect by value\n",
    "collect = sorted(collect.items(), key=lambda x: x[1][\"loss\"])\n",
    "print(f\"testing loss: {np.array(loss_collect).mean()}\")\n",
    "sum(bleu_scores) / len(bleu_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-06T13:16:14.099749Z",
     "start_time": "2024-05-06T13:16:13.991811900Z"
    },
    "ExecutionIndicator": {
     "show": true
    },
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 535,
     "referenced_widgets": [
      "40f7e3754ad44b33acfe0a80b3648a3a",
      "b1e51beac50f4947a9dd235d8aa87603",
      "8cd9e9702e114ebc856f56975544ede8",
      "b7c7a718a8654956947108969557ca83",
      "20a27d1ec76f4d85b1ffe99401fbb5b7",
      "e0ddf3970b3e4248bc87d4649fa9c448",
      "d7bdde54e2534c49a207540bd258d3ae",
      "22484000400842f0b6e245dc610acbba",
      "a66a5b4ff37d4dafa4ba3081aa1359f4",
      "0b7866c29e5f4afe9b92de15f1b88c3e",
      "333e84a304184c57af1821620ae80f6a"
     ]
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T13:51:09.426206Z",
     "iopub.status.busy": "2025-02-07T13:51:09.425839Z",
     "iopub.status.idle": "2025-02-07T13:51:12.229201Z",
     "shell.execute_reply": "2025-02-07T13:51:12.228694Z",
     "shell.execute_reply.started": "2025-02-07T13:51:09.426184Z"
    },
    "id": "KGSym4CbN4ya",
    "outputId": "f5e9c4c2-c92e-44e6-c83a-5cb720305428",
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Loading vocabulary from ./wmt16/vocab ...\n",
      "Read 4536393 words (18103 unique) from vocabulary file.\n",
      "Loading codes from ./wmt16/bpe.10000 ...\n",
      "Read 20001 codes from the codes file.\n",
      " 14%|█▍        | 18/128 [00:00<00:02, 41.73it/s]\n",
      "/usr/local/lib/python3.10/site-packages/IPython/core/pylabtools.py:170: UserWarning: There are no gridspecs with layoutgrids. Possibly did not call parent GridSpec with the \"figure\" keyword\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "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ditOnjxZBAQEiM2bN4ucnByRk5MjvvjiC9G2bVvx1FNPWVVjfXPr1i3x73//W/z+++91mif7b9nW8+pDjWpuX6l2aXmsjI2NFXq9XqSlpQk3Nzfx008/iX/961/C19dXLFu2rEbZ//jHP4ROpxOtWrUSp06dsjrH1sdzIW4f+vvll18KIYSYOHGiGD58uNizZ4946qmnROfOnS3Ok/2+yP58IEttbUc1fZiQEALz58+Hi4tLtZa/+xro91JWVoa3334b33//Pbp161ZhN2V1rjQze/ZsLFq0CI0bN77nVWwURbH4yive3t64efMmunfvjtDQUEybNg0DBw6Ep6enRTl31qUoClavXo3t27ejX79+AG5flzg7OxtPPfWURbnvvvsuFEXBU089hdLSUgCAo6MjZsyYgcWLF1uUVS46OhqTJk1CREQEhgwZgv79+wMAtm/fjp49e1qc9+GHH2LOnDmYNGkSSkpKANw+lGnq1Kl45513rKqxKnZ2dggLC8M777xz35OTZf/e3O8KSneq7u+1zDxA/t+yrefVhxrV3L5WZejQoThz5gzOnDlT4yz6H1sfKwH1xstXX30VRqMRQ4YMQUFBAQYNGmS6W/DMmTOrnVNVTb6+vujVqxdWrFhhmmfplehsfTwHgNdff910l+E333wTo0aNwsCBA+Hj44ONGzdanCfrfSkn+/PBvViynaqt7agihHbv+BIWFmbxZbzWr19frWOZBw8eXOVjiqJg586d1cr48ssv4enpKSXvTt988w0GDhwId3d3i55XWY3VYU2NwO2bUZ0+fRoA0L59+2r/QVTl4sWLuHDhArp37246PvXAgQNwd3dHp06drMq8deuWWY3lVyuSae3atTh37hy+++47pKWl3XNZ2b83st9jNX5nZP8t23pefahRze1rVf7xj3/gypUrWLBggdUZVJGtj5XlOWqNl8DtD1m//vorbt68Cb1eD1dXV4uer+ZYWV/G87tdvXoVXl5eNbqcak3flzup8fmgMpZsp2prO6rpZoCIiIiISMvknLpPRERERET1DpsBIiIiIiKNYjNwF4PBgDfeeMN0Nztby1Mj09bz1MjUWp4amVrLUyNTa3lqZKpRI1WPrb+XWvz9tfU8NTK1lqdGJs8ZuEt+fj48PDyQl5dX45Nx1MhTI9PW89TI1FqeGplay1MjU2t5amSqUSNVj62/l1r8/bX1PDUytZanRib3DBARERERaRSbASIiIiIijdLMTceMRiP++9//ws3N7Z7XbM3Pzzf7b03JzlMj09bz1MjUWp4amVrLUyNTa3lqZFY3TwiBGzduoEWLFqZriFPlGsp42ZB+fxtKnhqZWsuzJLO62z3NnDPwn//8B/7+/nVdBhER1aGcnBy0atWqrsuwaRwviRqW+233NLNnwM3NDQBw/lAA3F3lfCv056CuUnKIiEhdpSjBHmwzjQVUtfJ/o56jX4e9o7OUzGJ36+8yWxW7Yrl5jgVGqXnCTv46C8mRwl5uHuSvMuxK5OaV6eQWWeYkNe42SSWWFRfh+PpF993uaaYZKN/V6e5qB3c3Oc2Ag+IoJYeIiFT2xz7wex32QreV/xvZOzrDQVIzUOakQjMgOc+hRHvNgFH2p0AV/rxk9yuQ/btow82AKe4+2z0eOElEREREpFFsBoiIiIiINIrNABERERGRRrEZICIiIiLSKDYDREREREQaxWaAiIiIiEijpDcDYWFhmDlzJmbNmgUvLy80a9YMq1atwq1bt/DMM8/Azc0NgYGB+PbbbwEAZWVlmDp1Ktq2bYtGjRqhY8eOSEhIMMucMmUKxo4di3fffRfNmzeHj48PXnjhBZSUVH3xWYPBgPz8fLOJiIiIzHG8JNI2VfYMrFu3Dk2aNMGBAwcwc+ZMzJgxA+PHj8eAAQNw6NAhPPLII5g8eTIKCgpgNBrRqlUrfP7558jMzER0dDSioqKwadMms8xdu3bh9OnT2LVrF9atW4e1a9di7dq1VdYQFxcHDw8P08S7KRIREVXE8ZJI2xQhhJAZGBYWhrKyMvz0008Abn/z7+HhgXHjxuGTTz4BAFy8eBHNmzfHvn370K9fvwoZL774Ii5evIgvvvgCwO09AykpKTh9+jTs7W/ffuKxxx6DnZ0dPvvss0rrMBgMMBgMpp/z8/Ph7++Pa1ntpN10LLxFDyk5RESkrlJRghQkIS8vD+7u7nVdjk2parzsMy5G2k3HDB62fwdip1u86ViNqXHTMcnvc6mztu5AfGTta/fd7qlyB+Ju3bqZ/t/e3h4+Pj7o2rWraV6zZs0AAJcvXwYA/OMf/8DHH3+M7OxsFBYWori4GD169DDL7Ny5s6kRAIDmzZvj6NGjVdag0+mg0+lkrA4REVGDxfGSSNtUOUzI0dHR7GdFUczmld8W2Wg04rPPPsOcOXMwdepUbN++HRkZGXjmmWdQXFx830yjUW4XT0RERESkJarsGbDE3r17MWDAADz//POmeadPn67DioiIiIiItKHOLy3aoUMHHDx4EN9//z2ysrIwf/58/Pzzz3VdFhERERFRg1fnzcDf/vY3jBs3Do8//jhCQkKQm5trtpeAiIiIiIjUIf1qQrYqPz8fHh4evJoQEZEG8WpC1Vc+XvJqQjXDqwnJwasJWa+6VxOq8z0DRERERERUN9gMEBERERFpVJ1fTai2PbxgKuyd5Oz2dN/xHyk5d7IbkiM9k4iIyFJN/3oWjo3lHANx4Zb8Q7PyC+SM5eWuF8v9SFRyU4XjR8rkHuLicl7uOrtckn/kuU9KttQ8YZB83JEajGVSYkqN1VtX7hkgIiIiItIoNgNERERERBrFZoCIiIiISKPYDBARERERaRSbASIiIiIijbLZZiAsLAyzZs2q6zKIiIiIiBosm7206JYtW+Do6FjXZRARERERNVg22wx4e3vXdQlERERERA1avThMKCAgALGxsXj22Wfh5uaG1q1bY+XKlXVbIBERERFRPWezzcDd4uPj0adPH6Snp+P555/HjBkzcPLkySqXNxgMyM/PN5uIiIjIHMdLIm2rN83AyJEj8fzzzyMwMBDz5s1DkyZNsGvXriqXj4uLg4eHh2ny9/evxWqJiIjqB46XRNpWb5qBbt26mf5fURT4+fnh8uXLVS4fGRmJvLw805STk1MbZRIREdUrHC+JtM1mTyC+291XFlIUBUajscrldToddDqd2mURERHVaxwvibSt3uwZICIiIiIiudgMEBERERFpFJsBIiIiIiKNstlzBlJSUkz/f+7cuQqPZ2Rk1FotREREREQNEfcMEBERERFpFJsBIiIiIiKNstnDhNTiffAKHOzlXEKt5IyPlBwzO4TcvCH/kZtHRESakNhuF9zd5Hxn+OCRcVJy7vRAy2ypeYVljvdfyAIHz7eWmgcAiuQ81//YS81zP1ckNQ8ASv97UW6gsUxung0rEyXVWo57BoiIiIiINIrNABERERGRRrEZICIiIiLSKDYDREREREQaxWaAiIiIiEijVG0G1q5dC09Pz3suM2XKFIwdO1bNMoiIiIiIqBJ1fmnRhIQECPG/y2mGhYWhR48eWLp0ad0VRURERESkAXXeDHh4eNR1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odfrkZubi9TUVOTm5ppyvb29kZ+fb/GKEhERERGROYubgcr4+PhUaBDKLV26FPv27UN6ejq6d+8OAGjTpg02b96MkJAQTJ06FceOHYOiKNi6dSsSEhIwcuRIAEBAQAB69+5tVU0GgwEGg8H0MxsIIiKiijheEmmb6icQr1+/HsOGDTM1AqYXtrNDREQEMjMzcfjwYQCAn58ftm3bhhs3btT4dePi4uDh4WGa/P39a5xJRETU0HC8JNI2Kc3AgAED4OrqajaVy8rKQnBwcKXPK5+flZUFAFi5ciVSU1Ph4+ODvn37IiIiAnv37rWqpsjISOTl5ZmmnJwcq3KIiIgaMo6XRNom5TChjRs3VvmBHwCEENXKGTRoEM6cOYO0tDSkpqZix44dSEhIwMKFCzF//nyLatLpdNDpdBY9h4iISGs4XhJpm5Q9A/7+/ggMDDSbygUFBeHEiROVPq98flBQkGmeo6MjBg4ciHnz5mH79u148803sWjRIhQXF8solYiIiIiI/qD6OQMTJkxAcnKy6byAckajEUuWLIFer69wPsGd9Ho9SktLUVRUpHapRERERESaIuUwodzcXFy8eNFsnqenJ5ydnREREYGkpCSMHj3a7NKisbGxOHHiBJKTk6EoCoDbNxSbOHEi+vTpAx8fH2RmZiIqKgqDBw+Gu7u7jFKJiIiIiOgPUpqBoUOHVpi3YcMGTJgwAc7Ozti5cydiY2MRFRWF8+fPw83NDYMHD0ZaWhq6dOliek54eDjWrVuHqKgoFBQUoEWLFhg1ahSio6NllElERERERHeoUTMQEBBQrZODXVxcEBMTg5iYmHsuFxkZicjIyJqURERERERE1WTxOQMrVqyAq6srjh49qkY99zVixIgKdzsmIiIiIiLLWbRnIDExEYWFhQCA1q1bq1LQ/axevbrOayAiIiIiaggsagZatmypVh21V4Nid3uSQZTJyalHFDtFap4wSo27TXKNipC8zvXh16ZMcpGS32i74lKpecLRXmoeAAjJv4d2129JzVPK5L4noqf8PbYi/bj0TCLSOLmb5gZB9UuLEhERERGRbWIzQERERESkUWwGiIiIiIg0is0AEREREZFGsRkgIiIiItIoNgNERERERBrFZoCIiIiISKPYDBARERERaRSbASIiIiIijbLoDsT1icFggMFgMP2cn59fh9UQERHZJo6X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",
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.10/site-packages/IPython/core/pylabtools.py:170: UserWarning: There are no gridspecs with layoutgrids. Possibly did not call parent GridSpec with the \"figure\" keyword\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0cAAAHmCAYAAAC4ZfXhAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAeh5JREFUeJzt3XlYVGX7B/DvGZZhXwQUNBBRUBGXcl8QNEozzdRMzdyzbFXUVCx3E3+mIdVbb2qlmVuLpa8tlgvmjhu4QKKoQeWSmICoA8w8vz98mdcJUIZ5ZgG+n+s6l86ZM/fcZ85wnrnPOc9zFCGEABERERERUQ2nsnYCREREREREtoDFEREREREREVgcERERERERAWBxREREREREBIDFEREREREREQAWR0RERERERABYHBEREREREQFgcURERERERASAxREREREREREAFkdEREREREQAWBwREREREREBYHFEBAAoKioq97mrV69aMBMiIiIishYWR0QABg8eDCFEqfmXL19GdHS05RMiIiIiIotjcUQEICsrC88995zBvEuXLiE6OhpNmjSxUlZEREREZEmKKOtwOVEN89dff6Fr16547LHH8M477+DPP/9Et27d0LJlS6xfvx4qFY8jEBERmcOZM2ewc+dOXLlyBTqdzuC5mTNnWikrqqlYHBH9V3Z2Nrp06YIBAwZgy5YteOihh7BmzRrY2dlZOzUiIqJqafny5XjxxRfh6+sLf39/KIqif05RFBw9etSK2VFNxOKI6C4ZGRmIjIzEI488gtWrVxvspImIiEiu+vXr46WXXsLUqVOtnQoRABZHVIN5e3uXWfzcvHkTarXa4IzRtWvXLJkaERFRjeDh4YGUlBSEhIRYOxUiAIC9tRMgspalS5daOwUiIqIabeDAgfjpp58wbtw4a6dCBIBnjoiIiIjISuLj4/HOO+/g8ccfR/PmzeHg4GDw/GuvvWalzKimYnFEBOD777+HnZ0devToYTD/p59+glarxWOPPWalzIiIiKqvBg0alPucoig4d+6cBbMh4mV1RACAadOmYeHChaXm63Q6TJs2jcURERGRGZw/f97aKRAZ4M1biHDnHgvh4eGl5jdp0gRnz561QkZEREQ1R2FhIU6fPo3i4mJrp0I1HIsjIgCenp5lnro/e/YsXF1drZARERFR9Xfz5k2MGTMGLi4uaNas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w04tp8+RyyX5bZHGU+5xWsd8uR1cil2khgMAOObJzbHQQ25fD7c/tFLjOV4vvP9CRrLPLZIaT3VTIzVecS1XqfEAwCnzityAsvvnFRfLjQdASMqxWFfx7yDPHBEREREREYHFEREREREREQAWR0RERERERABYHBEREREREQGoYcXRypUr4eXldd/lFEXBt99+a/Z8iIiIiIjIdtSo4mjQoEHIyMjQP549ezZatWplvYSIiIiIiMhm1KihvJ2dneHs7GztNIiIiIiIyAZV+TNHW7ZsgZeXF7TaO2Pyp6SkQFEUTJs2Tb/Mc889h2effdbgsrqVK1dizpw5SE1NhaIoUBQFK1eu1L/m6tWr6NevH1xcXBAaGorNmzdbcrWIiIiIiMjCqnxxFBkZifz8fBw7dgwAsGvXLvj6+iIpKUm/zK5duxAdHW3wukGDBmHSpElo1qwZLl68iIsXL2LQoEH65+fMmYOnn34ax48fR69evTB06FBcu3bNEqtERERERERWUOWLI09PT7Rq1UpfDCUlJSE2NhbHjh3DjRs38Mcff+Ds2bOIiooyeJ2zszPc3Nxgb28Pf39/+Pv7G1xyN3LkSAwZMgSNGjXCggULcOPGDSQnJ5eZg0ajQV5ensFERERkSWyLiIhMV+WLIwCIiopCUlIShBDYvXs3+vfvj6ZNm2LPnj3YtWsX6tati9DQUKNitmjRQv9/V1dXeHh44MqVK2UuGx8fD09PT/0UGBho0voQEREZi20REZHpqkVxFB0djT179iA1NRUODg5o0qQJoqOjkZSUhF27dpU6a1QRDg4OBo8VRYFOpytz2bi4OOTm5uqn7OzsSq0HERFRZbEtIiIyXbUYra6k31FCQoK+EIqOjsbChQvx999/Y9KkSWW+ztHRUT+QgynUajXUarXJcYiIiCqLbRERkemqxZkjb29vtGjRAmvWrNEPvNC1a1ccPXoUGRkZ5Z45Cg4Oxvnz55GSkoKrV69Co9FYMGsiIiIiIrIl1aI4Au70O9JqtfriqFatWggPD4e/vz8aN25c5msGDBiAnj17olu3bvDz88O6dessmDEREREREdmSanFZHQAsXboUS5cuNZiXkpJi8HjkyJEYOXKk/rFarcZXX31VKpYQotS869evS8iSiIiIiIhsVbU5c0RERERERGQKFkdERERERERgcURERERERASAxRERERERERGAajQggy1yvZAPe7tCKbGEo/xN5flr6YEnTHH64zZS44WNOSw1HhFRTaSzBxRJTYiwU+QEuovO4f7LGEMr+VZPOgf566zo5La/WkfJOUoOp3O0kxsQgH2+3NuvKEXFUuPJ/gwBQNy8LTdgkZzfqHqSv9cAIIrlbBchKr6uPHNEREREREQEFkdEREREREQAWBwREREREREBYHFEREREREQEgMURERERERERABZHREREREREAFgcERERERERAWBxVK4ff/wRXbp0gZeXF3x8fNC7d29kZmZaOy0iIiIiIjITFkflKCgowMSJE3H48GFs374dKpUK/fr1g06nK7WsRqNBXl6ewURERGRJbIuIiEwn6Z7Z1c+AAQMMHn/yySfw8/NDWloaIiIiDJ6Lj4/HnDlzLJkeERGRAbZFRESm45mjcpw5cwZDhgxBSEgIPDw8EBwcDADIysoqtWxcXBxyc3P1U3Z2toWzJSKimo5tERGR6XjmqBx9+vRB/fr1sXz5ctStWxc6nQ4REREoLCwstaxarYZarbZClkRERHewLSIiMh2LozLk5OTg9OnTWL58OSIjIwEAe/bssXJWRERERERkTiyOyuDt7Q0fHx8sW7YMAQEByMrKwrRp06ydFhERERERmRH7HJVBpVJh/fr1OHLkCCIiIhAbG4u3337b2mkREREREZEZ8cxROWJiYpCWlmYwTwhhpWyIiIiIiMjceOaIiIiIiIgILI6IiIiIiIgAsDgiIiIiIiICwD5HZqVkXYSiOMoJVsb9lUzWJERquNq7HKTGy1zcQWq8hpMPSI1HRFQVFHkIaJ3k9Jl1zJUSxsBtX7n9eVVFitR4t2rL72/s/rtOajxhL/dYt5B86Nz+ZpHcgABU129IjSdu3pYaz87DRWo8ANBdl/sHKLRaqfEg5H6v78SU8/enExX/DvLMEREREREREVgcERERERERAWBxREREREREBIDFEREREREREQAji6Po6GhMmDDBTKkAI0eOxJNPPmm2+BWxcuVKeHl5WTUHIiIiIiKyPJ45IiIiIiIiAosjIiIiIiIiAJUojoqLi/HKK6/A09MTvr6+mDFjBsR/xyBfvXo12rRpA3d3d/j7++OZZ57BlStXDF5/6tQp9O7dGx4eHnB3d0dkZCQyMzPLfK9Dhw7Bz88P//d//wcAmD17Nlq1aoWPPvoI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jmeOynHmzBkMGTIEISEh8PDwQHBwMAAgKyur1LLx8fHw9PTUT4GBgRbOloiIajq2RUREpmNxVI4+ffrg2rVrWL58OQ4ePIiDBw8CAAoLC0stGxcXh9zcXP2UnZ1t6XSJiKiGY1tERGQ6XlZXhpycHJw+fRrLly9HZGQkAGDPnj3lLq9Wq6FWqy2VHhERUSlsi4iITMfiqAze3t7w8fHBsmXLEBAQgKysLEybNs3aaRERERERkRnxsroyqFQqrF+/HkeOHEFERARiY2Px9ttvWzstIiIiIiIyI545KkdMTAzS0tIM5gkhrJQNERERERGZG88cERERERERgcURERERERERABZHREREREREAFgcERERERERAeCADGalcneHSuUoJZb2ao6UOHdTBcu9e7oq7YLUeN5p91/GKHZ2kgMCxU2CpMbLXNJBaryGkw5IjUdEVY/3GQ3s7RUpsYpc5f9scP5L7mBHqiKd1HjmoNLKXWcnyZ9hsYvc9lJo5Xz/7lbsJuf3VYnCWk5S48EMg3jdCg+QHlMmnaT9jDkUF90GfqrYsjxzREREREREBBZHREREREREAFgcERERERERAWBxREREREREBIDFEYKDg7F06dJ7LpOUlARFUXD9+nWL5ERERERERJZX40erO3ToEFxdXa2dBhERERERWVmNL478/Pzu+XxRUZGFMiEiIiIiImuq9pfV5efnY+jQoXB1dUVAQAASEhIQHR2NCRMmACh9WZ2iKPjwww/xxBNPwNXVFW+99ZZ1EiciIiIiIouq9sXRxIkTsXfvXmzevBk///wzdu/ejaNHj97zNbNnz0a/fv1w4sQJjB49+r7vodFokJeXZzARERFZEtsiIiLTVeviKD8/H6tWrcLixYvx8MMPIyIiAp9++im0Wu09X/fMM89g1KhRCAkJQVBQ0H3fJz4+Hp6envopMDBQ1ioQERFVCNsiIiLTVevi6Ny5cygqKkK7du308zw9PdG4ceN7vq5NmzZGvU9cXBxyc3P1U3Z2dqXyJSIiqiy2RUREpqvxAzKUxdjR69RqNdRqtZmyISIiuj+2RUREpqvWZ45CQkLg4OCAQ4cO6efl5uYiIyPDilkREREREZEtqtZnjtzd3TFixAi8/vrrqFWrFmrXro1Zs2ZBpVJBURRrp0dERERERDakWp85AoB33nkHHTt2RO/evRETE4POnTujadOmcHJysnZqRERERERkQ6r1mSPgztmjNWvW6B8XFBRgzpw5eP755wEAFy5cMFheCFEqRnR0dJnziYiIiIio+qj2xdGxY8fw66+/ol27dsjNzcXcuXMBAH379rVyZkREREREZEuqfXEEAIsXL8bp06fh6OiI1q1bY/fu3fD19bV2WkREREREZEOqfXH04IMP4siRI9ZOg4iIiIiIbFy1L46syt4OUMn5iBVz3Lvi71yp4bR5N6TGUznJXWehvS01HgA4ZF6UGq/xUgep8TK/aC41Xv2nT0iNR0Tmp3VUQbGXM/6SY26RlDh3E3ZyR49VtHL7CGvV8seuKna2kxpPVaiTG69I7mdopymWGg8AdI5yt4v8z1BuPADQ1JL7G0HrKPdvTyV/M0NI+lMpLqr496Xaj1ZHRERERERUESyOiIiIiIiIwOKIiIiIiIgIAIsjIiIiIiIiADWsOFq5ciW8vLzuu5yiKPj222/Nng8REREREdmOGlUcDRo0CBkZGfrHs2fPRqtWrayXEBERERER2YwaNZS3s7MznJ2drZ0GERERERHZoCp/5mjLli3w8vKCVqsFAKSkpEBRFEybNk2/zHPPPYdnn33W4LK6lStXYs6cOUhNTYWiKFAUBStXrtS/5urVq+jXrx9cXFwQGhqKzZs3W3K1iIiIiIjIwqp8cRQZGYn8/HwcO3YMALBr1y74+voiKSlJv8yuXbsQHR1t8LpBgwZh0qRJaNasGS5evIiLFy9i0KBB+ufnzJmDp59+GsePH0evXr0wdOhQXLt2rcwcNBoN8vLyDCYiIiJLYltERGS6Kl8ceXp6olWrVvpiKCkpCbGxsTh27Bhu3LiBP/74A2fPnkVUVJTB65ydneHm5gZ7e3v4+/vD39/f4JK7kSNHYsiQIWjUqBEWLFiAGzduIDk5ucwc4uPj4enpqZ8CAwPNtr5ERERlYVtERGS6Kl8cAUBUVBSSkpIghMDu3bvRv39/NG3aFHv27MGuXbtQt25dhIaGGhWzRYsW+v+7urrCw8MDV65cKXPZuLg45Obm6qfs7GyT1oeIiMhYbIuIiExXLQZkiI6OxieffILU1FQ4ODigSZMmiI6ORlJSEv7+++9SZ40qwsHBweCxoijQ6XRlLqtWq6FWqyuVOxERkQxsi4iITFctzhyV9DtKSEjQF0IlxVFSUlKp/kYlHB0d9QM5EBERERFRzVYtiiNvb2+0aNECa9as0RdCXbt2xdGjR5GRkVHumaPg4GCcP38eKSkpuHr1KjQajQWzJiIiIiIiW1ItiiPgTr8jrVarL45q1aqF8PBw+Pv7o3HjxmW+ZsCAAejZsye6desGPz8/rFu3zoIZExERERGRLakWfY4AYOnSpVi6dKnBvJSUFIPHI0eOxMiRI/WP1Wo1vvrqq1KxhBCl5l2/fl1ClkREREREZKuqzZkjIiIiIiIiU7A4IiIiIiIiAosjIiIiIiIiANWoz5EtKr54BVAc7r9gRYiy77FkkoICqeEUB0ep8aQzw7DtuvwbUuOpPNylxmswt0hqvPwfQ6TGAwDXnuekxySi/9E5qKBzkHMstFhRpMS5m5AdUvJhX2GGdVbK6NtsCq2zndR4SrHk/JzkH4tXSc5RVST3d1aRm/yf2Oprctt0RSf3M4Tk7zUgL8fi4tsVXpZnjoiIiIiIiMDiiIiIiIiICACLIyIiIiIiIgAsjoiIiIiIiACwOCIiIiIiIgLA4oiIiIiIiAgAiyMiIiIiIiIALI7K9eOPP6JLly7w8vKCj48PevfujczMTGunRUREREREZsLiqBwFBQWYOHEiDh8+jO3bt0OlUqFfv37Q6cxwM1YiIiIiIrI6+bfvrSYGDBhg8PiTTz6Bn58f0tLSEBERYfCcRqOBRqPRP87Ly7NIjkRERCXYFhERmY5njspx5swZDBkyBCEhIfDw8EBwcDAAICsrq9Sy8fHx8PT01E+BgYEWzpaIiGo6tkVERKZjcVSOPn364Nq1a1i+fDkOHjyIgwcPAgAKCwtLLRsXF4fc3Fz9lJ2dbel0iYiohmNbRERkOl5WV4acnBycPn0ay5cvR2RkJABgz5495S6vVquhVqstlR4REVEpbIuIiEzH4qgM3t7e8PHxwbJlyxAQEICsrCxMmzbN2mkREREREZEZ8bK6MqhUKqxfvx5HjhxBREQEYmNj8fbbb1s7LSIiIiIiMiOeOSpHTEwM0tLSDOYJIayUDRERERERmRvPHBEREREREYHFEREREREREQAWR0RERERERABYHBEREREREQHggAxmpdjZQVHsJEWTFcd8FAe5Xyeh1UqNp9jb/tdd3NZIjacquCU1ntNCH6nxAOBsQgep8RrFHpAaj6iqs7uthV2xnP2psFOkxLmbSic5YJHcwZO0TvLbX7vbclda0cld5yJXue2lXaHsjQxA8joXO9v+7yytWu45DaUqjDMmKcdiI/aBPHNEREREREQEFkdEREREREQAWBwREREREREBsHBxFB0djQkTJlT69UlJSVAUBdevXwcArFy5El5eXlJyIyIiIiKimo1njoiIiIiIiMDiiIiIiIiICIAViqPi4mK88sor8PT0hK+vL2bMmAEh7ozTt3r1arRp0wbu7u7w9/fHM888gytXrhgV/8MPP0TDhg3h6OiIxo0bY/Xq1QbPZ2VloW/fvnBzc4OHhweefvppXL58Wf/87Nmz0apVK6xevRrBwcHw9PTE4MGDkZ+fb/rKExERERGRzbJ4cbRq1SrY29sjOTkZiYmJeOedd7BixQoAQFFREebNm4fU1FR8++23uHDhAkaOHFnh2N988w3Gjx+PSZMm4eTJk3jhhRcwatQo7Ny5EwCg0+nQt29fXLt2Dbt27cLPP/+Mc+fOYdCgQQZxMjMz8e2332LLli3YsmULdu3ahYULF0r7DIiIiIiIyPZY/K6YgYGBSEhIgKIoaNy4MU6cOIGEhASMHTsWo0eP1i8XEhKCd999F23btsWNGzfg5uZ239iLFy/GyJEj8dJLLwEAJk6ciAMHDmDx4sXo1q0btm/fjhMnTuD8+fMIDAwEAHz22Wdo1qwZDh06hLZt2wK4U0StXLkS7u7uAIBhw4Zh+/bteOutt8p8X41GA43mfzfvzMvLq9yHQ0REVElsi4iITGfxM0cdOnSAovzvDtsdO3bEmTNnoNVqceTIEfTp0wdBQUFwd3dHVFQUgDuXwlVEeno6OnfubDCvc+fOSE9P1z8fGBioL4wAIDw8HF5eXvplACA4OFhfGAFAQEDAPS/vi4+Ph6enp366Oz4REZElsC0iIjKdzQzIcPv2bfTo0QMeHh5Ys2YNDh06hG+++QYAUFhYaNFcHBwcDB4rigKdTlfu8nFxccjNzdVP2dnZ5k6RiIjIANsiIiLTWfyyuoMHDxo8PnDgAEJDQ/Hrr78iJycHCxcu1B/tOnz4sFGxmzZtir1792LEiBH6eXv37kV4eLj++ezsbGRnZ+vfIy0tDdevX9cvUxlqtRpqtbrSryciIjIV2yIiItNZvDjKysrCxIkT8cILL+Do0aN47733sGTJEgQFBcHR0RHvvfcexo0bh5MnT2LevHlGxX799dfx9NNP48EHH0RMTAz+85//YOPGjdi2bRsAICYmBs2bN8fQoUOxdOlSFBcX46WXXkJUVBTatGljjtUlIiIiIqIqwuKX1Q0fPhy3bt1Cu3bt8PLLL2P8+PF4/vnn4efnh5UrV+LLL79EeHg4Fi5ciMWLFxsV+8knn0RiYiIWL16MZs2a4aOPPsKnn36K6OhoAHcuj9u0aRO8vb3RtWtXxMTEICQkBBs2bDDDmhIRERERUVWiiJKbDJE0eXl58PT0RDeHgbBXHO7/gmpCcZB7IlJotVLj3T0QiDR2dlLDKY6OcuN5eUiNp6nvIzUeAJzvK3edG8UekBqPyFjFoghJ2ITc3Fx4eMj9GzRGSVvUudss2Ns7SYkp7OTvRxXZv0J0cgNqneTu5wHA/pbk9k3yOhe5ym3P7QrL77ddaZLXWedoM93wy6WS/DlK/9szB0k5Fhffxp5dcyq0X7b9bwIREREREZEFsDgiIiIiIiICiyMiIiIiIiIALI6IiIiIiIgAWGEo75pEFBdByOq7WgXGzRBFlr1Zr7HM8Qna+dSSG1DyIBRaH3ep8dS//iE1HgB4hYVIjZcztqPUeD7L90uNR2Rp6pzbsLeTswcUZhjYRpG834PkHIW9/OPIOke5P79URZIHeCiy/Y7/xZIHjZA92IjDjWKp8QAgP1DufcyKXKWGM4siVznbRasRwK6KLcszR0RERERERGBxREREREREBIDFEREREREREQAWR0RERERERABYHBEREREREQFgcURERERERASAxRERERERERGAGlocaTQavPbaa6hduzacnJzQpUsXHDp0CACQlJQERVGwfft2tGnTBi4uLujUqRNOnz5t5ayJiIiIiMicamRxNGXKFHz99ddYtWoVjh49ikaNGqFHjx64du2afpk33ngDS5YsweHDh2Fvb4/Ro0eXG0+j0SAvL89gIiIisiS2RUREpqtxxVFBQQE+/PBDvP3223jssccQHh6O5cuXw9nZGR9//LF+ubfeegtRUVEIDw/HtGnTsG/fPty+fbvMmPHx8fD09NRPgYGBllodIiIiAGyLiIhkqHHFUWZmJoqKitC5c2f9PAcHB7Rr1w7p6en6eS1atND/PyAgAABw5cqVMmPGxcUhNzdXP2VnZ5speyIiorKxLSIiMp29tROwVQ4ODvr/K4oCANDpdGUuq1aroVarLZIXERFRWdgWERGZrsadOWrYsCEcHR2xd+9e/byioiIcOnQI4eHhVsyMiIiIiIisqcadOXJ1dcWLL76I119/HbVq1UJQUBAWLVqEmzdvYsyYMUhNTbV2ikREREREZAU1rjgCgIULF0Kn02HYsGHIz89HmzZtsHXrVnh7e1s7NSIiIiIispIaWRw5OTnh3XffxbvvvlvquejoaAghDOa1atWq1DwiIiIiIqpealyfIyIiIiIiorKwOCIiIiIiIgKLIyIiIiIiIgA1tM+Rpdi5u8FOcZQSS5ufLyVOlaLIrd0VOzup8QBAm3NNajy7Rg2kxlMKi6XG017NkRoPAGon+8gNeOY3ueHe7ig1XsPX90uNR3Q/yh9XoKjktEWqu+4BKIsoKpIbUPK+XpEa7Q47Zyep8cSt21Lj2bm6SI0nHMzwc1PnKjWcVvI9whz+lrtNACC/k9zvzW1/rdR4wrHs+4GaonHon1LiFBdocLr0UANl4pkjIiIiIiIisDgiIiIiIiICwOKIiIiIiIgIAIsjIiIiIiIiADWsOEpKSoKiKLh+/bq1UyEiIiIiIhtTrYuj6OhoTJgwwdppEBERERFRFVCtiyMiIiIiIqKKqrbF0ciRI7Fr1y4kJiZCURQoioILFy4AAI4cOYI2bdrAxcUFnTp1wunTpw1eu2nTJjz00ENwcnJCSEgI5syZg+JiufeLISIiIiIi21Jti6PExER07NgRY8eOxcWLF3Hx4kUEBgYCAN544w0sWbIEhw8fhr29PUaPHq1/3e7duzF8+HCMHz8eaWlp+Oijj7By5Uq89dZb5b6XRqNBXl6ewURERGRJbIuIiExXbYsjT09PODo6wsXFBf7+/vD394fdf++a/dZbbyEqKgrh4eGYNm0a9u3bh9u379zJeM6cOZg2bRpGjBiBkJAQPPLII5g3bx4++uijct8rPj4enp6e+qmkCCMiIrIUtkVERKartsXRvbRo0UL//4CAAADAlStXAACpqamYO3cu3Nzc9FPJ2aebN2+WGS8uLg65ubn6KTs72/wrQUREdBe2RUREprO3dgLW4ODgoP+/oigAAJ1OBwC4ceMG5syZg/79+5d6nZOTU5nx1Go11Gq1GTIlIiKqGLZFRESmq9bFkaOjI7RarVGveeihh3D69Gk0atTITFkREREREZEtqtbFUXBwMA4ePIgLFy7Azc1Nf3boXmbOnInevXsjKCgITz31FFQqFVJTU3Hy5EnMnz/fAlkTEREREZE1VOs+R5MnT4adnR3Cw8Ph5+eHrKys+76mR48e2LJlC3766Se0bdsWHTp0QEJCAurXr2+BjImIiIiIyFqq9ZmjsLAw7N+/32DeyJEjDR63atUKQgiDeT169ECPHj3MnR4REREREdmQan3miIiIiIiIqKJYHBEREREREYHFEREREREREYBq3ufI6lQK8N/7KJnKrraflDh30127LjWeKC6SGg/i/qMLGsPOV/5nWHzxktR4ugtyb9qo8vaWGk/cfxGj6VLTpcaz8/SQGi90Ta7UeBlLO0iNBwCNJhyQHpOqEW0xoJNzLFQUF0uJYxBTK3dfr9hJPu6rmOE4sr3kn1+3bsuNJzk/pUj+90blIveeXkqxo9x4NzVS4wFAsZvcVtjeV+73RquV/7fS3OtPKXE09kXYWcFleeaIiIiIiIgILI6IiIiIiIgAsDgiIiIiIiICwOKIiIiIiIgIgI0VR9HR0ZgwYYLV3v/ChQtQFAUpKSlWy4GIiIiIiKzDpoojIiIiIiIia2FxREREREREBBssjoqLi/HKK6/A09MTvr6+mDFjBoS4M667RqPB5MmTUa9ePbi6uqJ9+/ZISkrSvzYnJwdDhgxBvXr14OLigubNm2PdunUG8XU6HRYtWoRGjRpBrVYjKCgIb731lsEy586dQ7du3eDi4oKWLVti//79Zl9vIiIiIiKyLpsrjlatWgV7e3skJycjMTER77zzDlasWAEAeOWVV7B//36sX78ex48fx8CBA9GzZ0+cOXMGAHD79m20bt0a3333HU6ePInnn38ew4YNQ3Jysj5+XFwcFi5ciBkzZiAtLQ1r165FnTp1DHJ44403MHnyZKSkpCAsLAxDhgxBsRlufEdERERERLZD8i2aTRcYGIiEhAQoioLGjRvjxIkTSEhIQI8ePfDpp58iKysLdevWBQBMnjwZP/74Iz799FMsWLAA9erVw+TJk/WxXn31VWzduhVffPEF2rVrh/z8fCQmJuL999/HiBEjAAANGzZEly5dDHKYPHkyHn/8cQDAnDlz0KxZM5w9exZNmjQpM2eNRgON5n93Qs7Ly5P6mRAREd0P2yIiItPZ3JmjDh06QFEU/eOOHTvizJkzOHHiBLRaLcLCwuDm5qafdu3ahczMTACAVqvFvHnz0Lx5c9SqVQtubm7YunUrsrKyAADp6enQaDR4+OGH75lDixYt9P8PCAgAAFy5cqXc5ePj4+Hp6amfAgMDK73+RERElcG2iIjIdDZ35qg8N27cgJ2dHY4cOQI7OzuD59zc3AAAb7/9NhITE7F06VI0b94crq6umDBhAgoLCwEAzs7OFXovBwcH/f9LCjWdTlfu8nFxcZg4caL+cV5eHhslIiKyKLZFRESms7ni6ODBgwaPDxw4gNDQUDz44IPQarW4cuUKIiMjy3zt3r170bdvXzz77LMA7hQ0GRkZCA8PBwCEhobC2dkZ27dvx3PPPSctZ7VaDbVaLS0eERGRsdgWERGZzuYuq8vKysLEiRNx+vRprFu3Du+99x7Gjx+PsLAwDB06FMOHD8fGjRtx/vx5JCcnIz4+Ht999x2AO8XPzz//jH379iE9PR0vvPACLl++rI/t5OSEqVOnYsqUKfjss8+QmZmJAwcO4OOPP7bW6hIRERERkY2wuTNHw4cPx61bt9CuXTvY2dlh/PjxeP755wEAn376KebPn49Jkybhjz/+gK+vLzp06IDevXsDAN58802cO3cOPXr0gIuLC55//nk8+eSTyM3N1cefMWMG7O3tMXPmTPz5558ICAjAuHHjrLKuRERERERkOxRRchMhkiYvLw+enp542GsY7BVHOUHNcKmE7tp1qfFEcZHUeLLZ+9e5/0JGKr54SWo8xV7u8QqVt7fUeLq//5YaDwCEVis1np2nh9R4Irie1HgZI+XmBwCNJhyQHpMqr1gUIQmbkJubCw8P+du7oszSFpmB0Jbfp7cyFDvJF8Uo8i+yUVwq1ge6okT+DanxFHc3qfGgkv8Zan09pca77e8iNZ5L5jWp8QDg7KjacgMG35QaTquVv537h6dIiaO5UYR/RX5bof2yzV1WR0REREREZA0sjoiIiIiIiMDiiIiIiIiICACLIyIiIiIiIgA2OFpddaK7cRM6Rc4gBSJPbmdLAIBObkd4W1d86fL9F7K2f9zg2FTi9m258YqLpcYDAJWrq9R4ipOT1Hg6e7nHkGonSw0HALjySiep8Wq/v09qPLIu3S0NdIqcQQ9kDxoDAJA8KIswQ6dwWyd936zRSA1nju+NqlDuOttpJA8MUiS/vbQvUKTGu10k9zeHr0++1HgAML+OnEYzz0WHf1Vw2Zq3ByEiIiIiIioDiyMiIiIiIiKwOCIiIiIiIgLA4oiIiIiIiAgAiyMiIiIiIiIALI6IiIiIiIgAsDgiIiIiIiICwOKIiIiIiIgIAG8CK4VGo4Hmrhum5eXlWTEbIiKqidgWERGZjmeOJIiPj4enp6d+CgwMtHZKRERUw7AtIiIyHYsjCeLi4pCbm6ufsrOzrZ0SERHVMGyLiIhMx8vqJFCr1VCr1dZOg4iIajC2RUREpuOZIyIiIiIiIrA4qrD3338fDz/8sLXTICIiIiIiM2FxVEFXr15FZmamtdMgIiIiIiIzYXFUQbNnz8aFCxesnQYREREREZkJiyMiIiIiIiKwOCIiIiIiIgLA4oiIiIiIiAgA73NkVnb+tWGnknPPieI/LkqJY0BR5IZzdJQaT2g0UuNBCLnxzED2Okv/DM1AV1Bg0/Fw6bLUcB6HpYYDAHhKvrdNn7QcqfE2h/tIjUfGUQXVg8pOzndEqOX/bFCKtHIDqmz/uK/OUe7nqNIUSY2nc5Hbnpuj/S3ydJIar9jVTmq8ogAvqfEAwPmK3M/RoUDuZ1jgJDceAEScek1KHN3t2wDeqNCytr8HISIiIiIisgAWR0RERERERGBxREREREREBIDFEREREREREQAbLo6io6OhKAoURUFKSkqNzYGIiIiIiCzDZosjABg7diwuXryIiIgIXLhwQV+o/HM6cOCA/jW3bt3CrFmzEBYWBrVaDV9fXwwcOBCnTp0yiH3z5k3ExcWhYcOGcHJygp+fH6KiorBp0yb9Mhs3bkRycrLF1peIiIiIiKzHpofydnFxgb+/v8G8bdu2oVmzZgbzfHzuDBOr0WgQExODrKwsLFmyBO3bt8fly5cRHx+P9u3bY9u2bejQoQMAYNy4cTh48CDee+89hIeHIycnB/v27UNOzv+GsK1Vqxby8vLMvJZERERERGQLbLo4KouPj0+pgqnE0qVLsX//fhw7dgwtW7YEANSvXx9ff/012rdvjzFjxuDkyZNQFAWbN29GYmIievXqBQAIDg5G69atLbYeRERERERkW2z6sjpjrV27Fo888oi+MCqhUqkQGxuLtLQ0pKamAgD8/f3x/fffIz8/3+T31Wg0yMvLM5iIiIgsiW0REZHpqlxx1KlTJ7i5uRlMJTIyMtC0adMyX1cyPyMjAwCwbNky7Nu3Dz4+Pmjbti1iY2Oxd+/eSuUUHx8PT09P/RQYGFipOERERJXFtoiIyHRVrjjasGEDUlJSDKa7CSEqFKdr1644d+4ctm/fjqeeegqnTp1CZGQk5s2bZ3ROcXFxyM3N1U/Z2dlGxyAiIjIF2yIiItNVuT5HgYGBaNSoUZnPhYWFIT09vcznSuaHhYXp5zk4OCAyMhKRkZGYOnUq5s+fj7lz52Lq1KlwdHSscE5qtRpqtdqItSAiIpKLbRERkemq3Jmjexk8eDC2bdum71dUQqfTISEhAeHh4aX6I90tPDwcxcXFuH37trlTJSIiIiIiG1Plzhzl5OTg0qVLBvO8vLzg5OSE2NhYbNq0CX369DEYynvBggVIT0/Htm3boCgKgDs3eB0yZAjatGkDHx8fpKWlYfr06ejWrRs8PDyssWpERERERGRFVa44iomJKTVv3bp1GDx4MJycnLBjxw4sWLAA06dPx2+//QZ3d3d069YNBw4cQEREhP41PXr0wKpVqzB9+nTcvHkTdevWRe/evTFz5kxLrg4REREREdmIKlMcBQcHV2iwBRcXF8yfPx/z58+/53JxcXGIi4uTlR4REREREVVxNt3n6IMPPoCbmxtOnDhhlfd/7LHH0KxZM6u8NxERERERWZbNnjlas2YNbt26BQAICgqySg4rVqyweg5ERERERGQZNlsc1atXz9op2EQORERERERkGTZbHFUHxX9cBBQHa6dRvgreMLfC4TQaqfFIgv+OziiN5O8MACj2tr0bEjq562wfWFdqPAAQN+XefiDx24ekxvN4Tmo4+KzYLzdgNae78Dt0ktoixVF+m6YrLpYaT7GzkxoPOp3ceABUTnLvRyVuy21/Va4uUuMpDvK/N4rGW27A2q5Swzn8+bfUeABwq7vcHG83kvu9CaqbIzUeACRFfCslTl6+Dt4zKrasTfc5IiIiIiIishQWR0RERERERGBxREREREREBIDFEREREREREQAbLo6io6OhKAoURUFKSkqNzYGIiIiIiCzDZosjABg7diwuXryIiIgIXLhwQV+o/HM6cOCA/jW3bt3CrFmzEBYWBrVaDV9fXwwcOBCnTp0yiH3z5k3ExcWhYcOGcHJygp+fH6KiorBp0yb9Mhs3bkRycrLF1peIiIiIiKzHpsfQdXFxgb+/v8G8bdu2oVmzZgbzfHx8AAAajQYxMTHIysrCkiVL0L59e1y+fBnx8fFo3749tm3bhg4dOgAAxo0bh4MHD+K9995DeHg4cnJysG/fPuTk/G8Ywlq1aiEvL8/Ma0lERERERLbApoujsvj4+JQqmEosXboU+/fvx7Fjx9CyZUsAQP369fH111+jffv2GDNmDE6ePAlFUbB582YkJiaiV69eAIDg4GC0bt3aYutBRERERES2xaYvqzPW2rVr8cgjj+gLoxIqlQqxsbFIS0tDamoqAMDf3x/ff/898vPzTX5fjUaDvLw8g4mIiMiS2BYREZmuyhVHnTp1gpubm8FUIiMjA02bNi3zdSXzMzIyAADLli3Dvn374OPjg7Zt2yI2NhZ79+6tVE7x8fHw9PTUT4GBgZWKQ0REVFlsi4iITFfliqMNGzYgJSXFYLqbEKJCcbp27Ypz585h+/bteOqpp3Dq1ClERkZi3rx5RucUFxeH3Nxc/ZSdnW10DCIiIlOwLSIiMl2V63MUGBiIRo0alflcWFgY0tPTy3yuZH5YWJh+noODAyIjIxEZGYmpU6di/vz5mDt3LqZOnQpHR8cK56RWq6FWq41YCyIiIrnYFhERma7KnTm6l8GDB2Pbtm36fkUldDodEhISEB4eXqo/0t3Cw8NRXFyM27dvmztVIiIiIiKyMVXuzFFOTg4uXbpkMM/LywtOTk6IjY3Fpk2b0KdPH4OhvBcsWID09HRs27YNiqIAuHOD1yFDhqBNmzbw8fFBWloapk+fjm7dusHDw8Maq0ZERERERFZU5YqjmJiYUvPWrVuHwYMHw8nJCTt27MCCBQswffp0/Pbbb3B3d0e3bt1w4MABRERE6F/To0cPrFq1CtOnT8fNmzdRt25d9O7dGzNnzrTk6hARERERkY2oMsVRcHBwhQZbcHFxwfz58zF//vx7LhcXF4e4uDhZ6RERERERURVn032OPvjgA7i5ueHEiRNWef/HHnsMzZo1s8p7ExERERGRZdnsmaM1a9bg1q1bAICgoCCr5LBixQqr50BERERERJZhs8VRvXr1rJ2CTeRARERERESWYbPFUbUgBICK3ZSWiOQQOsl/c0InN55WcjwA0GmlhnPMVaTGc88ulBpPG/2Q1HgAYJd0VHpMW6HYKVAUSVfRq+RfjV8yiqw0dnZy45mD7Bxlx1PZeH4AYC/3uyhkf7XN8Lci+yelKJb7t3ezyEFqPADIKr4hJU5+ccXbXpvuc0RERERERGQpLI6IiIiIiIjA4oiIiIiIiAgAiyMiIiIiIiIANlwcRUdHQ1EUKIqClJSUGpsDERERERFZhs0WRwAwduxYXLx4EREREbhw4YK+UPnndODAAf1rbt26hVmzZiEsLAxqtRq+vr4YOHAgTp06ZRD75s2biIuLQ8OGDeHk5AQ/Pz9ERUVh06ZN+mU2btyI5ORki60vERERERFZj00P5e3i4gJ/f3+Dedu2bUOzZs0M5vn4+AAANBoNYmJikJWVhSVLlqB9+/a4fPky4uPj0b59e2zbtg0dOnQAAIwbNw4HDx7Ee++9h/DwcOTk5GDfvn3IycnRx61Vqxby8vLMvJZERERERGQLbLo4KouPj0+pgqnE0qVLsX//fhw7dgwtW7YEANSvXx9ff/012rdvjzFjxuDkyZNQFAWbN29GYmIievXqBQAIDg5G69atLbYeRERERERkW2z6sjpjrV27Fo888oi+MCqhUqkQGxuLtLQ0pKamAgD8/f3x/fffIz8/3xqpEhERERGRjalyxVGnTp3g5uZmMJXIyMhA06ZNy3xdyfyMjAwAwLJly7Bv3z74+Pigbdu2iI2Nxd69eyuVk0ajQV5ensFERERkSWyLiIhMV+WKow0bNiAlJcVgupsQokJxunbtinPnzmH79u146qmncOrUKURGRmLevHlG5xQfHw9PT0/9FBgYaHQMIiIiU7AtIiIyXZUrjgIDA9GoUSODqURYWBjS09PLfF3J/LCwMP08BwcHREZGYurUqfjpp58wd+5czJs3D4WFhUblFBcXh9zcXP2UnZ1diTUjIiKqPLZFRESmq3LF0b0MHjwY27Zt0/crKqHT6ZCQkIDw8PBS/ZHuFh4ejuLiYty+fduo91Wr1fDw8DCYiIiILIltERGR6arcaHU5OTm4dOmSwTwvLy84OTkhNjYWmzZtQp8+fQyG8l6wYAHS09Oxbds2KIoC4M4NXocMGYI2bdrAx8cHaWlpmD59Orp168YGhYiIiIioBqpyxVFMTEypeevWrcPgwYPh5OSEHTt2YMGCBZg+fTp+++03uLu7o1u3bjhw4AAiIiL0r+nRowdWrVqF6dOn4+bNm6hbty569+6NmTNnWnJ1iIiIiIjIRlSZ4ig4OLhCgy24uLhg/vz5mD9//j2Xi4uLQ1xcnKz0iIiIiIioirPpPkcffPAB3NzccOLECau8/2OPPYZmzZpZ5b2JiIiIiMiybPbM0Zo1a3Dr1i0AQFBQkFVyWLFihdVzICIiIiIiy7DZ4qhevXrWTsEmciAiIiIiIsuw6cvqiIiIiIiILMVmzxxVC4pyZ5KhAoNREJmdrO9zTabVyo9ZVCw1nPpvufsbx781UuMpOvn7Q13nVtJiieLbwIFN0uKZTKUCFDnHQhU7+cdUhc5OajxF8n5K2MnNDwCgkhxTJXm7qCTv62XnB0DIbo8kr7Mww9+KInvXp5W7zkXF8v9WLmnVUuIUaHUVXpZnjoiIiIiIiMDiiIiIiIiICACLIyIiIiIiIgAsjoiIiIiIiADYcHEUHR0NRVGgKApSUlJqbA5ERERERGQZNlscAcDYsWNx8eJFRERE4MKFC/pC5Z/TgQMH9K+5desWZs2ahbCwMKjVavj6+mLgwIE4deqUQeybN28iLi4ODRs2hJOTE/z8/BAVFYVNm/43wtDGjRuRnJxssfUlIiIiIiLrsemhvF1cXODv728wb9u2bWjWrJnBPB8fHwCARqNBTEwMsrKysGTJErRv3x6XL19GfHw82rdvj23btqFDhw4AgHHjxuHgwYN47733EB4ejpycHOzbtw85OTn6uLVq1UJeXp6Z15KIiIiIiGyBTRdHZfHx8SlVMJVYunQp9u/fj2PHjqFly5YAgPr16+Prr79G+/btMWbMGJw8eRKKomDz5s1ITExEr169AADBwcFo3bq1xdaDiIiIiIhsi01fVmestWvX4pFHHtEXRiVUKhViY2ORlpaG1NRUAIC/vz++//575Ofnm/y+Go0GeXl5BhMREZElsS0iIjJdlSuOOnXqBDc3N4OpREZGBpo2bVrm60rmZ2RkAACWLVuGffv2wcfHB23btkVsbCz27t1bqZzi4+Ph6empnwIDAysVh4iIqLLYFhERma7KFUcbNmxASkqKwXQ3IUSF4nTt2hXnzp3D9u3b8dRTT+HUqVOIjIzEvHnzjM4pLi4Oubm5+ik7O9voGERERKZgW0REZLoq1+coMDAQjRo1KvO5sLAwpKenl/lcyfywsDD9PAcHB0RGRiIyMhJTp07F/PnzMXfuXEydOhWOjo4VzkmtVkOtVhuxFkRERHKxLSIiMl2VO3N0L4MHD8a2bdv0/YpK6HQ6JCQkIDw8vFR/pLuFh4ejuLgYt2/fNneqRERERERkY6rcmaOcnBxcunTJYJ6XlxecnJwQGxuLTZs2oU+fPgZDeS9YsADp6enYtm0bFEUBcOcGr0OGDEGbNm3g4+ODtLQ0TJ8+Hd26dYOHh4c1Vo2IiIiIiKyoyhVHMTExpeatW7cOgwcPhpOTE3bs2IEFCxZg+vTp+O233+Du7o5u3brhwIEDiIiI0L+mR48eWLVqFaZPn46bN2+ibt266N27N2bOnGnJ1SEiIiIiIhtRZYqj4ODgCg224OLigvnz52P+/Pn3XC4uLg5xcXGy0iMiIiIioirOpvscffDBB3Bzc8OJEyes8v6PPfYYmjVrZpX3JiIiIiIiy7LZM0dr1qzBrVu3AABBQUFWyWHFihVWz4GIiIiIiCzDZoujevXqWTuFSudQcvlfsSiSl0wF799EZEixdgL3pQid1HgVvddZxQPKzQ+6QrnxAAghN6a2UO6IncXFcuMpZtgf6orlNYfFxRoAZvguGskcbZE5PnshiqXGU4Sd1Hjm2I6KTu6FO7L3AYpO7meo6OR/hlqtRmq84mK57WWx5PwAQKuRuy/V3ZL4OxWA9qb8dS7Il9MGF9y4E6cif8+KsPbeuxr6/fffeWdyIqIaLjs7Gw888IDV3p9tERGRoYrsl1kcmYFOp8Off/4Jd3d3/dDhZcnLy0NgYCCys7OlDR8uO2ZNi2eOmDUtnjli2no8c8SsafHMEdNa8YQQyM/PR926daFSWa9rL9uiqhvPHDFrWjxzxKxp8cwRsyrsl232srqqTKVSGXW00MPDQ/q9lWTHrGnxzBGzpsUzR0xbj2eOmDUtnjliWiOep6entPerLLZFVT+eOWLWtHjmiFnT4pkjpi3vl216tDoiIiIiIiJLYXFEREREREQEFkdWpVarMWvWLKjVapuNWdPimSNmTYtnjpi2Hs8cMWtaPHPEtPV4toLb0vbimSNmTYtnjpg1LZ45Ytp6PIADMhAREREREQHgmSMiIiIiIiIALI6IiIiIiIgAsDgiIiIiIiICwOKIiIiIiIgIAIsjIiIiIiIiACyOiIiIiIiIALA4IiIiIiIiAsDiiIiIiIiICADw/4hF/yjtYJipAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.10/site-packages/IPython/core/pylabtools.py:170: UserWarning: There are no gridspecs with layoutgrids. Possibly did not call parent GridSpec with the \"figure\" keyword\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "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7x6SkpIwfPhw2Nvb67dZs2YhKSkJADBkyBAcP34c9evXx5gxY7B9+/Yn5h8eHo60tDT99qSrF0RERCQG218i4yoXVyQsLS0NfpYkCTqdrtiPt7OzM/hZrVbjjz/+wL59+7B9+3Z8+umneP/993Hw4EHY2toCAFasWIEWLVoUehwANGvWDJcuXcLvv/+OHTt2oE+fPujUqRM2btxY5PNrNBpoNJpi50tERESlx/aXyLjKxRWJx/Hz8ys0PiEhIQF37tyBv7//Ex8rSRJat26NiIgIxMXFwcrKCj/++CNcXV1Ro0YNXLx4ET4+PgZbnTp19I93dHTE66+/jhUrVuC7777Dpk2bcOvWLaMdKxERERGROSkXVyQep1OnTggICMCAAQOwcOFC5OXl4e2330ZwcDCCgoIe+7iDBw9i586deP7551G9enUcPHgQ//77L/z8/AAAERERGDNmDLRaLbp27Yrs7GwcOXIEt2/fxvjx4/HJJ5/A3d0dTZs2hUqlwg8//AA3Nzc4OTmV0ZETEREREZlWuS4kJEnCli1bMHr0aLRr1w4qlQpdu3bFp59++sTHOTo64s8//8TChQuRnp6O2rVrIyoqCt26dQMAjBgxAra2tvjoo48wceJE2NnZISAgQL/CtoODA+bPn4/z589DrVajefPm+O2336BSlesLPERERERExSbJBXOeUplJT0+HVqtFp1pvwUIlpu+mroqDkDgGMW0sn34nBZJDhYaD1+snxAYkIioDeXIuorEFaWlpcHR0NHU6lUpB++v3zhyoNdZCYrrF3hUS52EWKdeFxru33kZovOhGPwmN16XXIKHxAMAi+drT76SA7GgvNJ7u8l9C4z0IKuYjfZ6ci925PxTrHMWv0ImIiIiISDEWEkREREREpBgLCSIiIiIiUqxcD7Yu9yzUgEotJNS9OuLHSNjvTxYar+6b2ULjnVnWXGg83zcPC41HRETmySJThjpPUH9yeyshcR6mqu4sNF7KWa3QePVuDBEar6aL2DGZACBlVxUaL99R7Otsdc9FaDwAgII11p5E1uUAV4t3X16RICIiIiIixVhIEBERERGRYiwkiIiIiIhIMRYSRERERESkGAsJIiIiIiJSjIUEEREREREpxkJCgdzcXFOnQERERERkFip1IbF161a0adMGTk5OcHFxQffu3ZGUlAQASE5OhiRJ+O67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",
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.10/site-packages/IPython/core/pylabtools.py:170: UserWarning: There are no gridspecs with layoutgrids. Possibly did not call parent GridSpec with the \"figure\" keyword\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "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eaekpOCFF16Aq6srKleujF69eiEpKcngvHr37o158+bBx8cHderIXaiDiIiIiMiSlbggWLp0KVq0aIHRo0fj2rVruHbtGmxsbNC9e3c8+eSTiIuLwyeffILPPvsMc+fO1d9v4sSJOHDgAH788Ufs3LkT+/btw4kTJwxiv/766zh06BA2bNiA06dPo1+/fujatSsuXbqEli1bYsmSJXB2dtY/7qRJk/T3XbRoEZo2bYqTJ0/itddew6uvvoqEhAQAQF5eHrp06QInJyfs27cPBw4cgKOjI7p27WrQExATE4OEhATs3LkTP/300wOfg5ycHKSnpxtsREREZDpse4lMz7qkB7q4uMDW1hYODg7w8vICALz99tuoUaMGli9fDkVRULduXfz555+YMmUKZsyYgczMTKxbtw7r169Hp06dAABr1qyBj4+PPm5ycjLWrFmD5ORk/f5JkyYhOjoaa9aswbvvvgsXFxcoiqJ/3Pt1794dr732GgBgypQpWLx4Mfbs2YM6depg48aN0Ol0WLVqFRRF0T++q6srYmNj8cwzzwAAKlWqhFWrVsHW1vahz0FkZCQiIiJK+pQRERFRGbHtJTK9EhcExTl//jxatGih/7ANAK1atUJGRgZ+//13/PPPP8jLy0OzZs30t7u4uBhclnPmzBkUFBQgKCjIIHZOTg7c3d0fmUODBg30PxcWDTdv3gQAxMXF4fLly3BycjK4T3Z2NhITE/W/169f/5HFAACEh4dj4sSJ+t/T09NRo0aNR96PiIiISodtL5HplakgkCEjIwNWVlY4fvw4rKysDG5zdHR85P1tbGwMflcUBTqdTh/7iSeewFdffVXkfp6envqfK1WqVKJctVottFptiY4lIiKismPbS2R6RhUEtra2KCgo0P8eHByMTZs2QQih7yU4cOAAnJycUL16dbi5ucHGxgZHjx6Fr68vACAtLQ0XL15E27ZtAQCNGzdGQUEBbt68iTZt2pTocUuqSZMm2LhxI6pUqQJnZ2ej709ERERE9LgzatpRPz8/HD58GElJSbh16xZee+01pKSkYOzYsbhw4QK2bNmCmTNnYuLEidBoNHBycsKwYcMwefJk7NmzB+fOncOoUaOg0Wj0BURQUBAGDRqEoUOHYvPmzbhy5QqOHDmCyMhIbN26Vf+4GRkZiImJwa1bt5CVlVWifAcNGgQPDw/0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",
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "['man in white boat on small dock, in lake lake',\n",
       " 'a man with a backpack and a girl with a balloon on the beach.',\n",
       " 'three men on horses are competing in a race while the third of them watches.',\n",
       " 'a man and a woman are having a meal together at the same time of a festival.']"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import re\n",
    "from fastBPE import fastBPE\n",
    "from sacremoses import MosesDetokenizer, MosesTokenizer\n",
    "\n",
    "# `MosesTokenizer` 和 `MosesDetokenizer` 是来自 `sacremoses` 库的工具，用于自然语言处理中的分词（Tokenization）和去标记化（Detokenization）。这些工具主要用于对文本进行预处理和后处理，通常在处理自然语言处理任务时会用到。\n",
    "#\n",
    "# ### MosesTokenizer：\n",
    "# - **作用**：将原始文本分割成单词和标点符号。\n",
    "# - **特点**：基于 Moses 翻译工具中使用的分词方法。\n",
    "# - **功能**：\n",
    "#   - 将句子分割成单词和标点符号。\n",
    "#   - 处理缩写、连字符、标点等特殊情况。\n",
    "#   - 对文本进行标记化，方便后续处理。\n",
    "#\n",
    "# ### MosesDetokenizer：\n",
    "# - **作用**：将分词后的文本重新组合成原始的句子。\n",
    "# - **特点**：用于对分词后的文本进行还原，使其恢复为可读的句子形式。\n",
    "# - **功能**：\n",
    "#   - 将分词后的单词和标点符号重新组合成句子。\n",
    "#   - 处理分词后的标点、缩写等情况，使得结果更加自然和可读。\n",
    "#\n",
    "# 这些工具通常在文本预处理和后处理过程中使用，对输入的文本进行标记化和去标记化，是一种常用的处理方式。在自然语言处理任务中，对文本进行正确的分词和还原是很重要的，而 `MosesTokenizer` 和 `MosesDetokenizer` 提供了方便、高效的工具来处理这些任务。\n",
    "\n",
    "class Translator:\n",
    "    def __init__(self, model, src_tokenizer, trg_tokenizer):\n",
    "        self.bpe = fastBPE(\"./wmt16/bpe.10000\", \"./wmt16/vocab\")\n",
    "        self.mose_tokenizer = MosesTokenizer(lang=\"de\")\n",
    "        self.mose_detokenizer = MosesDetokenizer(lang=\"en\")\n",
    "        self.model = model\n",
    "        self.model.eval()\n",
    "        self.src_tokenizer = src_tokenizer\n",
    "        self.trg_tokenizer = trg_tokenizer\n",
    "        self.pattern = re.compile(r'(@@ )|(@@ ?$)')\n",
    "\n",
    "    def draw_attention_map(self, attn_scores, cross_attn_scores, src_words_list, trg_words_list):\n",
    "        \"\"\"绘制注意力热力图\n",
    "        attn_scores (numpy.ndarray): 表示自注意力机制（self-attention）分数。\n",
    "        cross_attn_scores (numpy.ndarray): 表示交叉注意力机制的注意力分数。\n",
    "        src_words_list (list): 源语言句子的单词列表。\n",
    "        trg_words_list (list): 目标语言句子的单词列表。\n",
    "        \"\"\"\n",
    "        assert len(attn_scores.shape) == 3, \"attn_scores shape should be \" \\\n",
    "            f\"[num heads, target sequence length, target sequence length], but got {attn_scores.shape}\"\n",
    "        attn_scores = attn_scores[:, :len(trg_words_list), :len(trg_words_list)]\n",
    "\n",
    "        assert len(cross_attn_scores.shape) == 3, \"attn_scores shape should be \" \\\n",
    "            f\"[num heads, target sequence length, source sequence length], but got {cross_attn_scores.shape}\"\n",
    "        cross_attn_scores = cross_attn_scores[:, :len(trg_words_list), :len(src_words_list)]\n",
    "\n",
    "        num_heads, trg_len, src_len = cross_attn_scores.shape\n",
    "\n",
    "        fig = plt.figure(figsize=(10, 5), constrained_layout=True) # constrained_layout=True 自动调整子图参数，使之填充整个图像区域\n",
    "        grid = plt.GridSpec(trg_len, trg_len + src_len, wspace=0.1, hspace=0.1)# wspace,hspace 控制子图之间的间距\n",
    "        #下面是attn_scores的热力图\n",
    "        self_map = fig.add_subplot(grid[:,:trg_len]) #  添加子图\n",
    "        self_map.matshow(attn_scores.mean(dim=0), cmap='viridis') # 绘制热力图，cmap表示颜色,dim=0表示对第0维求均值\n",
    "        self_map.set_yticks(range(trg_len), trg_words_list, fontsize=10)\n",
    "        self_map.set_xticks(range(trg_len), [\"[BOS]\"] + trg_words_list[:-1], rotation=90)\n",
    "        #下面是cross_attn_scores的热力图\n",
    "        cross_map = fig.add_subplot(grid[:, trg_len:])\n",
    "        cross_map.matshow(cross_attn_scores.mean(dim=0), cmap='viridis')\n",
    "        cross_map.set_yticks(range(trg_len), [], fontsize=6)\n",
    "        cross_map.set_xticks(range(src_len), src_words_list, rotation=90)\n",
    "\n",
    "        plt.show()\n",
    "\n",
    "    def draw_attention_maps(self, attn_scores, cross_attn_scores, src_words_list, trg_words_list, heads_list):\n",
    "        \"\"\"绘制注意力热力图\n",
    "\n",
    "        Args:\n",
    "            - scores (numpy.ndarray): shape = [source sequence length, target sequence length]\n",
    "        \"\"\"\n",
    "        assert len(attn_scores.shape) == 3, \"attn_scores shape should be \" \\\n",
    "            f\"[num heads, target sequence length, target sequence length], but got {attn_scores.shape}\"\n",
    "        attn_scores = attn_scores[:, :len(trg_words_list), :len(trg_words_list)]\n",
    "\n",
    "        assert len(cross_attn_scores.shape) == 3, \"attn_scores shape should be \" \\\n",
    "            f\"[num heads, target sequence length, source sequence length], but got {cross_attn_scores.shape}\"\n",
    "        cross_attn_scores = cross_attn_scores[:, :len(trg_words_list), :len(src_words_list)]\n",
    "        # cross_attn_scores = cross_attn_scores[:, :len(src_words_list), :len(src_words_list)]\n",
    "\n",
    "        num_heads, trg_len, src_len = cross_attn_scores.shape\n",
    "        fig, axes = plt.subplots(2, len(heads_list), figsize=(5 * len(heads_list), 10))\n",
    "        for i, heads_idx in enumerate(heads_list):\n",
    "            axes[0, i].matshow(attn_scores[heads_idx], cmap='viridis')\n",
    "            axes[0, i].set_yticks(range(trg_len), trg_words_list)\n",
    "            axes[0, i].set_xticks(range(trg_len), [\"[BOS]\"] + trg_words_list[:-1], rotation=90)\n",
    "            axes[0, i].set_title(f\"head {heads_idx}\")\n",
    "            axes[1, i].matshow(cross_attn_scores[heads_idx], cmap='viridis')\n",
    "            axes[1, i].set_yticks(range(trg_len), trg_words_list)\n",
    "            axes[1, i].set_xticks(range(src_len), src_words_list, rotation=90)\n",
    "            axes[1, i].set_title(f\"head {heads_idx}\")\n",
    "\n",
    "        plt.show()\n",
    "\n",
    "\n",
    "    def __call__(self, sentence_list, heads_list=None, layer_idx=-1):\n",
    "        # 将输入句子列表转换为小写，并使用 MosesTokenizer 进行分词处理。\n",
    "        sentence_list = [\" \".join(self.mose_tokenizer.tokenize(s.lower())) for s in sentence_list]\n",
    "        # 将分词后的结果进行 BPE 编码，得到 tokens_list。\n",
    "        tokens_list = [s.split() for s in self.bpe.apply(sentence_list)]\n",
    "        # 使用 src_tokenizer 对 tokens_list 进行编码，同时添加起始标记 ([BOS]) 和结束标记 ([EOS])。\n",
    "        encoder_input, attn_mask = self.src_tokenizer.encode(\n",
    "            tokens_list,\n",
    "            add_bos=True,\n",
    "            add_eos=True,\n",
    "            return_mask=True,\n",
    "            )\n",
    "        encoder_input = torch.Tensor(encoder_input).to(dtype=torch.int64)\n",
    "        # 使用模型的 infer 方法对编码器输入进行推理，得到输出结果 outputs\n",
    "        outputs = model.infer(encoder_inputs=encoder_input, encoder_inputs_mask=attn_mask)\n",
    "\n",
    "        preds = outputs.preds.numpy()\n",
    "        # 使用目标语言的 trg_tokenizer 对预测序列进行解码，得到解码后的目标语言句子列表 trg_decoded。\n",
    "        trg_decoded = self.trg_tokenizer.decode(preds, split=True, remove_eos=False, remove_bos=False, remove_pad=False)\n",
    "        # 使用源语言的 src_tokenizer 对编码器输入进行解码，得到解码后的源语言句子列表 src_decoded。为下面绘制热力图做准备。\n",
    "        src_decoded = self.src_tokenizer.decode(\n",
    "            encoder_input.numpy(),\n",
    "            split=True,\n",
    "            remove_bos=False,\n",
    "            remove_eos=False\n",
    "            )\n",
    "\n",
    "        # post processed attn scores\n",
    "        # outputs.decoder_attentions[-1]  # the last layer of self-attention scores\n",
    "\n",
    "        # draw the attention map of the last decoder block\n",
    "        for attn_score, cross_attn_score, src, trg in zip(\n",
    "            outputs.decoder_self_attn_scores[layer_idx], outputs.decoder_cross_attn_scores[layer_idx], src_decoded, trg_decoded):\n",
    "            if heads_list is None:# 如果没有指定heads_list，就画单个热力图\n",
    "                self.draw_attention_map(\n",
    "                    attn_score,\n",
    "                    cross_attn_score,\n",
    "                    src,\n",
    "                    trg,\n",
    "                )\n",
    "            else:# 如果指定了heads_list，就画多个热力图\n",
    "                self.draw_attention_maps(\n",
    "                    attn_score,\n",
    "                    cross_attn_score,\n",
    "                    src,\n",
    "                    trg,\n",
    "                    heads_list=heads_list,\n",
    "                    )\n",
    "        return [self.mose_detokenizer.tokenize(self.pattern.sub(\"\", s).split()) for s in self.trg_tokenizer.decode(preds)] #将解码后的目标语言句子列表返回，并使用 mose_detokenizer 进行去标记化，最终得到翻译后的结果。\n",
    "\n",
    "\n",
    "# sentence_list = [\n",
    "#     \"Mann in einem kleinen weißen Boot auf einem See.\",  # Man in a small white boat on a lake.\n",
    "#     \"Ein Mann mit einem Eimer und ein Mädchen mit einem Hut am Strand.\", # A man with a bucket and a girl in a hat on the beach.\n",
    "#     \"Drei Männer auf Pferden während eines Rennens.\",  # Three men on horses during a race.\n",
    "#     \"Ein Mann und eine Frau essen zu Abend\",  # 一个男人和一个女人在吃晚餐\n",
    "# ]\n",
    "sentence_list = [\n",
    "    \"Mann in einem kleinen weißen Boot auf einem See.\",  # Man in a small white boat on a lake.\n",
    "    \"Ein Mann mit einem Eimer und ein Mädchen mit einem Hut am Strand.\", # A man with a bucket and a girl in a hat on the beach.\n",
    "    \"Drei Männer auf Pferden während eines Rennens.\",  # Three men on horses during a race.\n",
    "    \"Ein Mann und eine Frau essen zu Abend\",  # A man and a woman eating dinner\n",
    "]\n",
    "\n",
    "# load checkpoints\n",
    "model = TransformerModel(config)\n",
    "model.load_state_dict(state_dict)\n",
    "translator = Translator(model.cpu(), tokenizer, tokenizer)\n",
    "translator(\n",
    "    sentence_list,\n",
    "    layer_idx=-1,\n",
    "    # heads_list=[0, 1, 2, 3, 4, 5, 6, 7]\n",
    "    )\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.status.busy": "2025-01-22T08:58:14.585829Z",
     "iopub.status.idle": "2025-01-22T08:58:14.585997Z",
     "shell.execute_reply": "2025-01-22T08:58:14.585919Z",
     "shell.execute_reply.started": "2025-01-22T08:58:14.585911Z"
    },
    "id": "e0WkUQuUe-Cy",
    "outputId": "433e3d70-4f34-4376-e4a3-1b8834e71f88"
   },
   "outputs": [],
   "source": [
    "!ls checkpoints"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "execution": {
     "iopub.status.busy": "2025-01-22T08:58:14.586647Z",
     "iopub.status.idle": "2025-01-22T08:58:14.586812Z",
     "shell.execute_reply": "2025-01-22T08:58:14.586739Z",
     "shell.execute_reply.started": "2025-01-22T08:58:14.586731Z"
    },
    "id": "_1ZLtdahywWf",
    "tags": []
   },
   "outputs": [],
   "source": [
    "# prompt: 把best.ckpt复制到云盘内\n",
    "\n",
    "!cp -r checkpoints/translate-transformer-not-share/best.ckpt /content/drive/MyDrive/transformer-de-en\n"
   ]
  }
 ],
 "metadata": {
  "accelerator": "GPU",
  "colab": {
   "gpuType": "T4",
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.14"
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "00fe6a550df547cea5b1e0d84c1a3f5f": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "success",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_83f345f7424c43929d7a304cbfb6d0fe",
      "max": 9714,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_58d69d086f644e89937347e1f9261d6f",
      "value": 9714
     }
    },
    "013d2a6b90144432bbfb15136235faba": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "0b7866c29e5f4afe9b92de15f1b88c3e": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "0c0c7229347b49ffbb9a0f7bd41199b9": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "0e10428326bc436e8dbc079e89570bde": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "0fe4ed7283c04496affe727c235d31c4": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "19f846338f6b48c9930b58575641e5b8": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "20a27d1ec76f4d85b1ffe99401fbb5b7": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "22484000400842f0b6e245dc610acbba": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "22aa774ab39e4fd78b0ff08d430d2b5d": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "success",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_4e64bcb87e584beda0408a0aa5a659ae",
      "max": 1,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_b077d7562d814df5b6d839464dd4122f",
      "value": 1
     }
    },
    "2b82e42c34804b13bc83be4c7009d4e2": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "333e84a304184c57af1821620ae80f6a": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "40f7e3754ad44b33acfe0a80b3648a3a": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_b1e51beac50f4947a9dd235d8aa87603",
       "IPY_MODEL_8cd9e9702e114ebc856f56975544ede8",
       "IPY_MODEL_b7c7a718a8654956947108969557ca83"
      ],
      "layout": "IPY_MODEL_20a27d1ec76f4d85b1ffe99401fbb5b7"
     }
    },
    "434ac4c51db74681942d2d3bd869b1df": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "46a51a1719d8444eb5877720253d3c37": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "4e64bcb87e584beda0408a0aa5a659ae": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": "20px"
     }
    },
    "55146ac7395840dca847e0f63aa80561": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_abb9bc76c0ce4634bd340be20c074b8c",
       "IPY_MODEL_a89d790df59245fcaf26335d4903c9b4",
       "IPY_MODEL_f837255914194dc792cf1514dee03dc5"
      ],
      "layout": "IPY_MODEL_46a51a1719d8444eb5877720253d3c37"
     }
    },
    "58d69d086f644e89937347e1f9261d6f": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "5a28babf4e2e4393bdc1a093034885ab": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "673bd3773a374261a01cfc48081c27f3": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "7190c928edb040c3a523cdd2e3f45572": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_990741ff083d457587665d8f620b69c3",
       "IPY_MODEL_00fe6a550df547cea5b1e0d84c1a3f5f",
       "IPY_MODEL_fab8b1e3187841ee894b92859fa4821b"
      ],
      "layout": "IPY_MODEL_f9b0d916e1a64c2a9f384e42f3d5dcab"
     }
    },
    "7d293204dc1b4d97bb5ee670787c7b7d": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "83f345f7424c43929d7a304cbfb6d0fe": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "8cd9e9702e114ebc856f56975544ede8": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "danger",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_22484000400842f0b6e245dc610acbba",
      "max": 128,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_a66a5b4ff37d4dafa4ba3081aa1359f4",
      "value": 12
     }
    },
    "8cf462fa996c41b18fb4571e0a757363": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "9233439bdd6746c28ad4a20ef47799f6": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "990741ff083d457587665d8f620b69c3": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_a78199650ecc47bd81f482a2671b563a",
      "placeholder": "​",
      "style": "IPY_MODEL_673bd3773a374261a01cfc48081c27f3",
      "value": "100%"
     }
    },
    "9a01f02fb99b4b81ac487d23bc5daf4a": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_5a28babf4e2e4393bdc1a093034885ab",
      "placeholder": "​",
      "style": "IPY_MODEL_be07d518c21149d196c610fd57b1eaec",
      "value": " 957/? [00:18&lt;00:00, 51.31it/s]"
     }
    },
    "a66a5b4ff37d4dafa4ba3081aa1359f4": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "a78199650ecc47bd81f482a2671b563a": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "a89d790df59245fcaf26335d4903c9b4": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "success",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_9233439bdd6746c28ad4a20ef47799f6",
      "max": 280,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_0e10428326bc436e8dbc079e89570bde",
      "value": 280
     }
    },
    "a972aba7913b48c6973ae27bff5b9d1d": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_7d293204dc1b4d97bb5ee670787c7b7d",
      "placeholder": "​",
      "style": "IPY_MODEL_ea8fa440f320435aa75c9bef75bc3f08",
      "value": ""
     }
    },
    "abb9bc76c0ce4634bd340be20c074b8c": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_013d2a6b90144432bbfb15136235faba",
      "placeholder": "​",
      "style": "IPY_MODEL_2b82e42c34804b13bc83be4c7009d4e2",
      "value": ""
     }
    },
    "b077d7562d814df5b6d839464dd4122f": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "b1e51beac50f4947a9dd235d8aa87603": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_e0ddf3970b3e4248bc87d4649fa9c448",
      "placeholder": "​",
      "style": "IPY_MODEL_d7bdde54e2534c49a207540bd258d3ae",
      "value": "  9%"
     }
    },
    "b7c7a718a8654956947108969557ca83": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_0b7866c29e5f4afe9b92de15f1b88c3e",
      "placeholder": "​",
      "style": "IPY_MODEL_333e84a304184c57af1821620ae80f6a",
      "value": " 12/128 [00:00&lt;00:01, 73.96it/s]"
     }
    },
    "be07d518c21149d196c610fd57b1eaec": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "c9db4cd83b7b4f53a0fa93b8c365debd": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_a972aba7913b48c6973ae27bff5b9d1d",
       "IPY_MODEL_22aa774ab39e4fd78b0ff08d430d2b5d",
       "IPY_MODEL_9a01f02fb99b4b81ac487d23bc5daf4a"
      ],
      "layout": "IPY_MODEL_19f846338f6b48c9930b58575641e5b8"
     }
    },
    "d7bdde54e2534c49a207540bd258d3ae": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "e0ddf3970b3e4248bc87d4649fa9c448": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "ea8fa440f320435aa75c9bef75bc3f08": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "f837255914194dc792cf1514dee03dc5": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_0fe4ed7283c04496affe727c235d31c4",
      "placeholder": "​",
      "style": "IPY_MODEL_0c0c7229347b49ffbb9a0f7bd41199b9",
      "value": " 21020/? [21:30&lt;00:00, 15.32it/s, epoch=19, loss=2.61, val_loss=3.41]"
     }
    },
    "f9b0d916e1a64c2a9f384e42f3d5dcab": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "fab8b1e3187841ee894b92859fa4821b": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_8cf462fa996c41b18fb4571e0a757363",
      "placeholder": "​",
      "style": "IPY_MODEL_434ac4c51db74681942d2d3bd869b1df",
      "value": " 9714/9714 [00:00&lt;00:00, 236744.37it/s]"
     }
    }
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
